Index: /applications/editors/josm/plugins/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/Dto.java
===================================================================
--- /applications/editors/josm/plugins/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/Dto.java	(revision 35507)
+++ /applications/editors/josm/plugins/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/Dto.java	(revision 35508)
@@ -9,10 +9,12 @@
 public class Dto implements Serializable {
 
-    private static final long serialVersionUID = 5226513739078369787L;
+    private static final long serialVersionUID = 7719940860196679722L;
 
     private boolean saveBuilding = true;
+    private boolean saveSource = true;
     private boolean saveCountry = true;
     private boolean saveState = true;
     private boolean saveCity = true;
+    private boolean saveSuburb = true;
     private boolean savePostcode = true;
     private boolean saveStreet = true;
@@ -22,7 +24,9 @@
    
     private String building = "yes";
+    private String source;
     private String country;
     private String state;
     private String city;
+    private String suburb;
     private String postcode;
     private String street;
@@ -166,3 +170,35 @@
         this.place = place;
     }
+
+    public boolean isSaveSuburb() {
+        return saveSuburb;
+    }
+
+    public void setSaveSuburb(boolean saveSuburb) {
+        this.saveSuburb = saveSuburb;
+    }
+
+    public String getSuburb() {
+        return suburb;
+    }
+
+    public void setSuburb(String suburb) {
+        this.suburb = suburb;
+    }
+
+    public boolean isSaveSource() {
+        return saveSource;
+    }
+
+    public void setSaveSource(boolean saveSource) {
+        this.saveSource = saveSource;
+    }
+
+    public String getSource() {
+        return source;
+    }
+
+    public void setSource(String source) {
+        this.source = source;
+    }
 }
Index: /applications/editors/josm/plugins/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberHelper.java
===================================================================
--- /applications/editors/josm/plugins/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberHelper.java	(revision 35508)
+++ /applications/editors/josm/plugins/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberHelper.java	(revision 35508)
@@ -0,0 +1,24 @@
+package org.openstreetmap.josm.plugins.housenumbertool;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class HouseNumberHelper {
+
+    static public String incrementHouseNumber(String number, int increment) {
+        if (number != null) {
+            try {
+                Matcher m = Pattern.compile("([^\\pN]+)?(\\pN+)([^\\pN]+)?").matcher(number);
+                if (m.matches()) {
+                    String prefix = m.group(1) != null ? m.group(1) : "";
+                    int n = Integer.parseInt(m.group(2)) + increment;
+                    String suffix = m.group(3) != null ? m.group(3) : "";
+                    return prefix + n + suffix;
+                }
+            } catch (NumberFormatException e)  {
+                // Do nothing
+            }
+        }
+        return null;
+    }
+}
Index: /applications/editors/josm/plugins/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/TagDialog.java
===================================================================
--- /applications/editors/josm/plugins/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/TagDialog.java	(revision 35507)
+++ /applications/editors/josm/plugins/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/TagDialog.java	(revision 35508)
@@ -1,39 +1,4 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.housenumbertool;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trn;
-
-import java.awt.Dimension;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.swing.ButtonGroup;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
-import javax.swing.JSlider;
-import javax.swing.JTextField;
-import javax.swing.SwingUtilities;
 
 import org.openstreetmap.josm.command.ChangePropertyCommand;
@@ -48,4 +13,18 @@
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
 
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.io.*;
+import java.util.List;
+import java.util.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
 /**
  * @author Oliver Raupach 09.01.2012
@@ -57,4 +36,5 @@
 
     private static final String TAG_BUILDING = "building";
+    private static final String TAG_SOURCE = "source";
     private static final String TAG_ADDR_COUNTRY = "addr:country";
     private static final String TAG_ADDR_STATE = "addr:state";
@@ -64,4 +44,5 @@
     private static final String TAG_ADDR_STREET = "addr:street";
     private static final String TAG_ADDR_PLACE = "addr:place";
+    private static final String TAG_ADDR_SUBURB = "addr:suburb";
 
     private static final String[] BUILDING_STRINGS = {
@@ -82,6 +63,8 @@
     private static final String TEMPLATE_DATA = "/template.data";
 
+    private AutoCompletingComboBox source;
     private AutoCompletingComboBox country;
     private AutoCompletingComboBox state;
+    private AutoCompletingComboBox suburb;
     private AutoCompletingComboBox city;
     private AutoCompletingComboBox postcode;
@@ -89,7 +72,9 @@
     private JTextField housnumber;
     private JCheckBox buildingEnabled;
+    private JCheckBox sourceEnabled;
     private JCheckBox countryEnabled;
     private JCheckBox stateEnabled;
     private JCheckBox cityEnabled;
+    private JCheckBox suburbEnabled;
     private JCheckBox zipEnabled;
     private JCheckBox streetEnabled;
@@ -98,4 +83,5 @@
     private JComboBox<String> building;
     private JRadioButton streetRadio;
+    private JRadioButton placeRadio;
 
     /**
@@ -111,6 +97,6 @@
         JPanel editPanel = createContentPane();
 
-        setPreferredSize(new Dimension(700, 300));
-        setMinimumSize(new Dimension(700, 300));
+        setPreferredSize(new Dimension(900, 500));
+        setMinimumSize(new Dimension(900, 500));
 
         setContent(editPanel);
@@ -137,4 +123,42 @@
         GridBagConstraints c = new GridBagConstraints();
 
+        JLabel labelNewValues = new JLabel();
+        Font newLabelFont = new Font(labelNewValues.getFont().getName(), Font.BOLD, labelNewValues.getFont().getSize());
+        labelNewValues.setFont(newLabelFont);
+        labelNewValues.setText(tr("New values:"));
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 3;
+        c.gridy = 0;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(0, 5, 10, 5);
+        editPanel.add(labelNewValues, c);
+
+        JLabel labelExistingValues = new JLabel();
+        labelExistingValues.setFont(newLabelFont);
+        labelExistingValues.setText(tr("Existing values:"));
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 5;
+        c.gridy = 0;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(0, 5, 10, 5);
+        editPanel.add(labelExistingValues, c);
+
+        JButton getAllButton = new JButton("<<");
+        getAllButton.setPreferredSize(new Dimension(60, 24));
+        getAllButton.setToolTipText(tr("Accept all existing values"));
+        getAllButton.addActionListener(actionEvent -> acceptAllExistingValues());
+        GridBagConstraints buttonContstraints = new GridBagConstraints();
+        buttonContstraints.fill = GridBagConstraints.NONE;
+        buttonContstraints.gridx = 6;
+        buttonContstraints.gridy = 0;
+        buttonContstraints.weightx = 0;
+        buttonContstraints.gridwidth = 1;
+        buttonContstraints.anchor = GridBagConstraints.EAST;
+        buttonContstraints.insets = new Insets(0, 5, 10, 5);
+        editPanel.add(getAllButton, buttonContstraints);
+
+        // building
         buildingEnabled = new JCheckBox(TAG_BUILDING);
         buildingEnabled.setFocusable(false);
@@ -143,7 +167,8 @@
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 0;
-        c.gridy = 0;
+        c.gridy = 1;
         c.weightx = 0;
         c.gridwidth = 3;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(buildingEnabled, c);
 
@@ -153,8 +178,82 @@
         building.setMaximumRowCount(50);
         c.gridx = 3;
-        c.gridy = 0;
-        c.weightx = 1;
-        c.gridwidth = 1;
+        c.gridy = 1;
+        c.weightx = 1;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(building, c);
+
+        JButton getBuildingButton = new JButton("<");
+        getBuildingButton.setPreferredSize(new Dimension(45, 24));
+        getBuildingButton.setToolTipText(tr("Accept existing value"));
+        getBuildingButton.addActionListener(actionEvent -> building.setSelectedItem(selection.get(TAG_BUILDING)));
+        c.fill = GridBagConstraints.NONE;
+        c.gridx = 4;
+        c.gridy = 1;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(getBuildingButton, c);
+
+        JTextField existingBuilding = new JTextField();
+        existingBuilding.setText(selection.get(TAG_BUILDING));
+        existingBuilding.setPreferredSize(new Dimension(200, 24));
+        existingBuilding.setEditable(false);
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 5;
+        c.gridy = 1;
+        c.weightx = 1;
+        c.gridwidth = 2;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(existingBuilding, c);
+
+        // source
+        sourceEnabled = new JCheckBox(TAG_SOURCE);
+        sourceEnabled.setFocusable(false);
+        sourceEnabled.setSelected(dto.isSaveBuilding());
+        sourceEnabled.setToolTipText(APPLY_CHANGES);
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 0;
+        c.gridy = 2;
+        c.weightx = 0;
+        c.gridwidth = 3;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(sourceEnabled, c);
+
+        source = new AutoCompletingComboBox();
+        source.setPossibleAcItems(acm.getTagValues(TAG_SOURCE));
+        source.setPreferredSize(new Dimension(200, 24));
+        source.setEditable(true);
+        source.setSelectedItem(dto.getSource());
+        c.gridx = 3;
+        c.gridy = 2;
+        c.weightx = 1;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(source, c);
+
+        JButton getSourceButton = new JButton("<");
+        getSourceButton.setPreferredSize(new Dimension(45, 24));
+        getSourceButton.setToolTipText(tr("Accept existing value"));
+        getSourceButton.addActionListener(actionEvent -> source.setSelectedItem(selection.get(TAG_SOURCE)));
+        c.fill = GridBagConstraints.NONE;
+        c.gridx = 4;
+        c.gridy = 2;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(getSourceButton, c);
+
+        JTextField existingSource = new JTextField();
+        existingSource.setText(selection.get(TAG_SOURCE));
+        existingSource.setPreferredSize(new Dimension(200, 24));
+        existingSource.setEditable(false);
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 5;
+        c.gridy = 2;
+        c.weightx = 1;
+        c.gridwidth = 2;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(existingSource, c);
 
         // country
@@ -166,7 +265,8 @@
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 0;
-        c.gridy = 1;
+        c.gridy = 3;
         c.weightx = 0;
         c.gridwidth = 3;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(countryEnabled, c);
 
@@ -178,8 +278,33 @@
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 3;
-        c.gridy = 1;
-        c.weightx = 1;
-        c.gridwidth = 1;
+        c.gridy = 3;
+        c.weightx = 1;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(country, c);
+
+        JButton getCountryButton = new JButton("<");
+        getCountryButton.setPreferredSize(new Dimension(45, 24));
+        getCountryButton.setToolTipText(tr("Accept existing value"));
+        getCountryButton.addActionListener(actionEvent -> country.setSelectedItem(selection.get(TAG_ADDR_COUNTRY)));
+        c.fill = GridBagConstraints.NONE;
+        c.gridx = 4;
+        c.gridy = 3;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(getCountryButton, c);
+
+        JTextField existingCountry = new JTextField();
+        existingCountry.setText(selection.get(TAG_ADDR_COUNTRY));
+        existingCountry.setPreferredSize(new Dimension(200, 24));
+        existingCountry.setEditable(false);
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 5;
+        c.gridy = 3;
+        c.weightx = 1;
+        c.gridwidth = 2;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(existingCountry, c);
 
         // state
@@ -188,10 +313,10 @@
         stateEnabled.setSelected(dto.isSaveState());
         stateEnabled.setToolTipText(APPLY_CHANGES);
-        c = new GridBagConstraints();
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 0;
-        c.gridy = 2;
+        c.gridy = 4;
         c.weightx = 0;
         c.gridwidth = 3;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(stateEnabled, c);
 
@@ -203,8 +328,83 @@
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 3;
-        c.gridy = 2;
-        c.weightx = 1;
-        c.gridwidth = 1;
+        c.gridy = 4;
+        c.weightx = 1;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(state, c);
+
+        JButton getStateButton = new JButton("<");
+        getStateButton.setPreferredSize(new Dimension(45, 24));
+        getStateButton.setToolTipText(tr("Accept existing value"));
+        getStateButton.addActionListener(actionEvent -> state.setSelectedItem(selection.get(TAG_ADDR_STATE)));
+        c.fill = GridBagConstraints.NONE;
+        c.gridx = 4;
+        c.gridy = 4;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(getStateButton, c);
+
+        JTextField existingState= new JTextField();
+        existingState.setText(selection.get(TAG_ADDR_STATE));
+        existingState.setPreferredSize(new Dimension(200, 24));
+        existingState.setEditable(false);
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 5;
+        c.gridy = 4;
+        c.weightx = 1;
+        c.gridwidth = 2;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(existingState, c);
+
+        // suburb
+        suburbEnabled = new JCheckBox(TAG_ADDR_SUBURB);
+        suburbEnabled.setFocusable(false);
+        suburbEnabled.setSelected(dto.isSaveSuburb());
+        suburbEnabled.setToolTipText(APPLY_CHANGES);
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 0;
+        c.gridy = 5;
+        c.weightx = 0;
+        c.gridwidth = 3;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(suburbEnabled, c);
+
+        suburb = new AutoCompletingComboBox();
+        suburb.setPossibleAcItems(acm.getTagValues(TAG_ADDR_SUBURB));
+        suburb.setPreferredSize(new Dimension(200, 24));
+        suburb.setEditable(true);
+        suburb.setSelectedItem(dto.getSuburb());
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 3;
+        c.gridy = 5;
+        c.weightx = 1;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(suburb, c);
+
+        JButton getSuburbButton = new JButton("<");
+        getSuburbButton.setPreferredSize(new Dimension(45, 24));
+        getSuburbButton.setToolTipText(tr("Accept existing value"));
+        getSuburbButton.addActionListener(actionEvent -> suburb.setSelectedItem(selection.get(TAG_ADDR_SUBURB)));
+        c.fill = GridBagConstraints.NONE;
+        c.gridx = 4;
+        c.gridy = 5;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(getSuburbButton, c);
+
+        JTextField existingSuburb = new JTextField();
+        existingSuburb.setText(selection.get(TAG_ADDR_SUBURB));
+        existingSuburb.setPreferredSize(new Dimension(200, 24));
+        existingSuburb.setEditable(false);
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 5;
+        c.gridy = 5;
+        c.weightx = 1;
+        c.gridwidth = 2;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(existingSuburb, c);
 
         // city
@@ -215,7 +415,8 @@
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 0;
-        c.gridy = 3;
+        c.gridy = 6;
         c.weightx = 0;
         c.gridwidth = 3;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(cityEnabled, c);
 
@@ -227,8 +428,33 @@
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 3;
-        c.gridy = 3;
-        c.weightx = 1;
-        c.gridwidth = 1;
+        c.gridy = 6;
+        c.weightx = 1;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(city, c);
+
+        JButton getCityButton = new JButton("<");
+        getCityButton.setPreferredSize(new Dimension(45, 24));
+        getCityButton.setToolTipText(tr("Accept existing value"));
+        getCityButton.addActionListener(actionEvent -> city.setSelectedItem(selection.get(TAG_ADDR_CITY)));
+        c.fill = GridBagConstraints.NONE;
+        c.gridx = 4;
+        c.gridy = 6;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(getCityButton, c);
+
+        JTextField existingCity = new JTextField();
+        existingCity.setText(selection.get(TAG_ADDR_CITY));
+        existingCity.setPreferredSize(new Dimension(200, 24));
+        existingCity.setEditable(false);
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 5;
+        c.gridy = 6;
+        c.weightx = 1;
+        c.gridwidth = 2;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(existingCity, c);
 
         // postcode
@@ -239,7 +465,8 @@
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 0;
-        c.gridy = 4;
+        c.gridy = 7;
         c.weightx = 0;
         c.gridwidth = 3;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(zipEnabled, c);
 
@@ -251,8 +478,33 @@
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 3;
-        c.gridy = 4;
-        c.weightx = 1;
-        c.gridwidth = 1;
+        c.gridy = 7;
+        c.weightx = 1;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(postcode, c);
+
+        JButton getPostcodeButton = new JButton("<");
+        getPostcodeButton.setPreferredSize(new Dimension(45, 24));
+        getPostcodeButton.setToolTipText(tr("Accept existing value"));
+        getPostcodeButton.addActionListener(actionEvent -> postcode.setSelectedItem(selection.get(TAG_ADDR_POSTCODE)));
+        c.fill = GridBagConstraints.NONE;
+        c.gridx = 4;
+        c.gridy = 7;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(getPostcodeButton, c);
+
+        JTextField existingPostcode = new JTextField();
+        existingPostcode.setText(selection.get(TAG_ADDR_POSTCODE));
+        existingPostcode.setPreferredSize(new Dimension(200, 24));
+        existingPostcode.setEditable(false);
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 5;
+        c.gridy = 7;
+        c.weightx = 1;
+        c.gridwidth = 2;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(existingPostcode, c);
 
         // street
@@ -263,7 +515,8 @@
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 0;
-        c.gridy = 5;
-        c.weightx = 0;
-        c.gridwidth = 1;
+        c.gridy = 8;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(streetEnabled, c);
 
@@ -274,10 +527,11 @@
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 1;
-        c.gridy = 5;
-        c.weightx = 0;
-        c.gridwidth = 1;
+        c.gridy = 8;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(streetRadio, c);
 
-        JRadioButton placeRadio = new JRadioButton("addr:place");
+        placeRadio = new JRadioButton("addr:place");
         placeRadio.setToolTipText(TAG_STREET_OR_PLACE);
         placeRadio.setSelected(!dto.isTagStreet());
@@ -285,11 +539,12 @@
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 2;
-        c.gridy = 5;
-        c.weightx = 0;
-        c.gridwidth = 1;
+        c.gridy = 8;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(placeRadio, c);
 
         ButtonGroup g = new ButtonGroup();
-        g.add( streetRadio );
+        g.add(streetRadio);
         g.add(placeRadio);
 
@@ -305,8 +560,46 @@
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 3;
-        c.gridy = 5;
-        c.weightx = 1;
-        c.gridwidth = 1;
+        c.gridy = 8;
+        c.weightx = 1;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(street, c);
+
+        JButton getStreetButton = new JButton("<");
+        getStreetButton.setPreferredSize(new Dimension(45, 24));
+        getStreetButton.setToolTipText(tr("Accept existing value"));
+        getStreetButton.addActionListener(actionEvent -> updateStreetOrPlaceValues());
+        c.fill = GridBagConstraints.NONE;
+        c.gridx = 4;
+        c.gridy = 8;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(getStreetButton, c);
+
+        JTextField streetOrPlace = new JTextField();
+        streetOrPlace.setText(getStreetOrPlaceTag());
+        streetOrPlace.setPreferredSize(new Dimension(50, 24));
+        streetOrPlace.setEditable(false);
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 5;
+        c.gridy = 8;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(streetOrPlace, c);
+
+        JTextField existingStreet = new JTextField();
+        existingStreet.setText(getStreetOrPlaceValue());
+        existingStreet.setPreferredSize(new Dimension(100, 24));
+        existingStreet.setEditable(false);
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 6;
+        c.gridy = 8;
+        c.weightx = 1;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(existingStreet, c);
+
 
         // housenumber
@@ -317,7 +610,8 @@
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 0;
-        c.gridy = 6;
+        c.gridy = 9;
         c.weightx = 0;
         c.gridwidth = 3;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(housenumberEnabled, c);
 
@@ -325,5 +619,5 @@
         housnumber.setPreferredSize(new Dimension(200, 24));
 
-        String number = incrementHouseNumber(dto.getHousenumber(), dto.getHousenumberChangeValue());
+        String number = HouseNumberHelper.incrementHouseNumber(dto.getHousenumber(), dto.getHousenumberChangeValue());
         if (number != null) {
             housnumber.setText(number);
@@ -332,18 +626,45 @@
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 3;
-        c.gridy = 6;
-        c.weightx = 1;
-        c.gridwidth = 1;
+        c.gridy = 9;
+        c.weightx = 1;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(housnumber, c);
 
+        JButton getHousenumberButton = new JButton("<");
+        getHousenumberButton.setPreferredSize(new Dimension(45, 24));
+        getHousenumberButton.setToolTipText(tr("Accept existing value"));
+        getHousenumberButton.addActionListener(actionEvent -> housnumber.setText(selection.get(TAG_ADDR_HOUSENUMBER)));
+        c.fill = GridBagConstraints.NONE;
+        c.gridx = 4;
+        c.gridy = 9;
+        c.weightx = 0;
+        c.gridwidth = 1;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(getHousenumberButton, c);
+
+        JTextField existingHousenumber = new JTextField();
+        existingHousenumber.setText(selection.get(TAG_ADDR_HOUSENUMBER));
+        existingHousenumber.setPreferredSize(new Dimension(200, 24));
+        existingHousenumber.setEditable(false);
+        c.fill = GridBagConstraints.HORIZONTAL;
+        c.gridx = 5;
+        c.gridy = 9;
+        c.weightx = 1;
+        c.gridwidth = 2;
+        c.insets = new Insets(5, 5, 0, 5);
+        editPanel.add(existingHousenumber, c);
+
+        // increment
         JLabel seqLabel = new JLabel(tr("House number increment:"));
         c.fill = GridBagConstraints.HORIZONTAL;
         c.gridx = 0;
-        c.gridy = 7;
+        c.gridy = 10;
         c.weightx = 0;
         c.gridwidth = 3;
+        c.insets = new Insets(5, 5, 0, 5);
         editPanel.add(seqLabel, c);
 
-        housenumberChangeSequence = new JSlider(JSlider.HORIZONTAL,  FPS_MIN, FPS_MAX, dto.getHousenumberChangeValue());
+        housenumberChangeSequence = new JSlider(JSlider.HORIZONTAL, FPS_MIN, FPS_MAX, dto.getHousenumberChangeValue());
         housenumberChangeSequence.setPaintTicks(true);
         housenumberChangeSequence.setMajorTickSpacing(1);
@@ -352,7 +673,8 @@
         housenumberChangeSequence.setSnapToTicks(true);
         c.gridx = 3;
-        c.gridy = 7;
-        c.weightx = 1;
-        c.gridwidth = 1;
+        c.gridy = 10;
+        c.weightx = 1;
+        c.gridwidth = 4;
+        c.insets = new Insets(20, 5, 10, 5);
         editPanel.add(housenumberChangeSequence, c);
 
@@ -360,19 +682,44 @@
     }
 
-    static String incrementHouseNumber(String number, int increment) {
-        if (number != null) {
-            try {
-                Matcher m = Pattern.compile("([^\\pN]+)?(\\pN+)([^\\pN]+)?").matcher(number);
-                if (m.matches()) {
-                    String prefix = m.group(1) != null ? m.group(1) : "";
-                    int n = Integer.parseInt(m.group(2)) + increment;
-                    String suffix = m.group(3) != null ? m.group(3) : "";
-                    return prefix + n + suffix;
-                }
-            } catch (NumberFormatException e)  {
-                // Do nothing
-            }
-        }
-        return null;
+    private void acceptAllExistingValues() {
+        updateStreetOrPlaceValues();
+        building.setSelectedItem(selection.get(TAG_BUILDING));
+        source.setSelectedItem(selection.get(TAG_SOURCE));
+        country.setSelectedItem(selection.get(TAG_ADDR_COUNTRY));
+        state.setSelectedItem(selection.get(TAG_ADDR_STATE));
+        suburb.setSelectedItem(selection.get(TAG_ADDR_SUBURB));
+        city.setSelectedItem(selection.get(TAG_ADDR_CITY));
+        postcode.setSelectedItem(selection.get(TAG_ADDR_POSTCODE));
+        housnumber.setText(selection.get(TAG_ADDR_HOUSENUMBER));
+    }
+
+    private void updateStreetOrPlaceValues() {
+        if (selection.hasTag(TAG_ADDR_PLACE)) {
+            placeRadio.setSelected(true);
+            street.setSelectedItem(selection.get(TAG_ADDR_PLACE));
+        }else {
+            streetRadio.setSelected(true);
+            street.setSelectedItem(selection.get(TAG_ADDR_STREET));
+        }
+    }
+
+    private String getStreetOrPlaceValue() {
+        if (selection.hasTag(TAG_ADDR_PLACE)) {
+            return selection.get(TAG_ADDR_PLACE);
+        } else if (selection.hasTag(TAG_ADDR_STREET)) {
+            return selection.get(TAG_ADDR_STREET);
+        } else {
+            return "";
+        }
+    }
+
+    private String getStreetOrPlaceTag() {
+        if (selection.hasTag(TAG_ADDR_PLACE)) {
+            return TAG_ADDR_PLACE;
+        } else if (selection.hasTag(TAG_ADDR_STREET)) {
+            return TAG_ADDR_STREET;
+        } else {
+            return "";
+        }
     }
 
@@ -382,4 +729,5 @@
             Dto dto = new Dto();
             dto.setSaveBuilding(buildingEnabled.isSelected());
+            dto.setSaveSource(sourceEnabled.isSelected());
             dto.setSaveCity(cityEnabled.isSelected());
             dto.setSaveCountry(countryEnabled.isSelected());
@@ -389,6 +737,8 @@
             dto.setSaveStreet(streetEnabled.isSelected());
             dto.setTagStreet(streetRadio.isSelected());
+            dto.setSaveSuburb(suburbEnabled.isSelected());
 
             dto.setBuilding((String) building.getSelectedItem());
+            dto.setSource(getAutoCompletingComboBoxValue(source));
             dto.setCity(getAutoCompletingComboBoxValue(city));
             dto.setCountry(getAutoCompletingComboBoxValue(country));
@@ -397,4 +747,5 @@
             dto.setStreet(getAutoCompletingComboBoxValue(street));
             dto.setState(getAutoCompletingComboBoxValue(state));
+            dto.setSuburb(getAutoCompletingComboBoxValue(suburb));
             dto.setHousenumberChangeValue(housenumberChangeSequence.getValue());
 
@@ -449,4 +800,12 @@
         }
 
+        if (dto.isSaveSource()) {
+            String value = selection.get(TagDialog.TAG_SOURCE);
+            if (value == null || (value != null && !value.equals(dto.getSource()))) {
+                ChangePropertyCommand command = new ChangePropertyCommand(selection, TagDialog.TAG_SOURCE, dto.getSource());
+                commands.add(command);
+            }
+        }
+
         if (dto.isSaveCity()) {
             String value = selection.get(TagDialog.TAG_ADDR_CITY);
@@ -461,4 +820,12 @@
             if (value == null || (value != null && !value.equals(dto.getCountry()))) {
                 ChangePropertyCommand command = new ChangePropertyCommand(selection, TagDialog.TAG_ADDR_COUNTRY, dto.getCountry());
+                commands.add(command);
+            }
+        }
+
+        if (dto.isSaveSuburb())  {
+            String value = selection.get(TagDialog.TAG_ADDR_SUBURB);
+            if (value == null || (value != null && !value.equals(dto.getSuburb()))) {
+                ChangePropertyCommand command = new ChangePropertyCommand(selection, TagDialog.TAG_ADDR_SUBURB, dto.getSuburb());
                 commands.add(command);
             }
@@ -547,22 +914,29 @@
             if (fileName.exists()) {
                 try (
-                    FileInputStream file = new FileInputStream(fileName);
-                    ObjectInputStream o = new ObjectInputStream(file);
+                        FileInputStream file = new FileInputStream(fileName);
+                        ObjectInputStream o = new ObjectInputStream(file);
                 ) {
                     dto = (Dto) o.readObject();
                 }
             } else {
-                dto.setCity(selection.get(TagDialog.TAG_ADDR_CITY));
-                dto.setCountry(selection.get(TagDialog.TAG_ADDR_COUNTRY));
-                dto.setHousenumber(selection.get(TagDialog.TAG_ADDR_HOUSENUMBER));
-                dto.setPostcode(selection.get(TagDialog.TAG_ADDR_POSTCODE));
-                dto.setStreet(selection.get(TagDialog.TAG_ADDR_STREET));
-                dto.setState(selection.get(TagDialog.TAG_ADDR_STATE));
+                loadExistingValuesToDto(dto);
             }
         } catch (Exception ex) {
             LOGGER.log(Level.SEVERE, ex.getMessage());
             fileName.delete();
+            loadExistingValuesToDto(dto);
         }
         return dto;
+    }
+
+    private void loadExistingValuesToDto(Dto dto) {
+        dto.setCity(selection.get(TagDialog.TAG_ADDR_CITY));
+        dto.setCountry(selection.get(TagDialog.TAG_ADDR_COUNTRY));
+        dto.setSource(selection.get(TagDialog.TAG_SOURCE));
+        dto.setHousenumber(selection.get(TagDialog.TAG_ADDR_HOUSENUMBER));
+        dto.setPostcode(selection.get(TagDialog.TAG_ADDR_POSTCODE));
+        dto.setStreet(selection.get(TagDialog.TAG_ADDR_STREET));
+        dto.setState(selection.get(TagDialog.TAG_ADDR_STATE));
+        dto.setSuburb(selection.get(TagDialog.TAG_ADDR_SUBURB));
     }
 
Index: /applications/editors/josm/plugins/HouseNumberTaggingTool/test/unit/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberHelperTest.java
===================================================================
--- /applications/editors/josm/plugins/HouseNumberTaggingTool/test/unit/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberHelperTest.java	(revision 35508)
+++ /applications/editors/josm/plugins/HouseNumberTaggingTool/test/unit/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberHelperTest.java	(revision 35508)
@@ -0,0 +1,27 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.housenumbertool;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Test;
+
+/**
+ * Unit tests of {@link TagDialog}.
+ */
+public class HouseNumberHelperTest {
+
+    /**
+     * Unit test of {@link HouseNumberHelper#incrementHouseNumber}
+     */
+    @Test
+    public void testIncrementHouseNumber() {
+        assertEquals("2", HouseNumberHelper.incrementHouseNumber("1", 1));
+        assertEquals("12", HouseNumberHelper.incrementHouseNumber("10", 2));
+        assertEquals("2A", HouseNumberHelper.incrementHouseNumber("1A", 1));
+        assertEquals("E2", HouseNumberHelper.incrementHouseNumber("E1", 1));
+        //assertEquals("۲", HouseNumberHelper.incrementHouseNumber("۱", 1)); // FIXME: how to increment persian numbers ?
+        assertEquals("2", HouseNumberHelper.incrementHouseNumber("۱", 1));
+        assertNull(HouseNumberHelper.incrementHouseNumber(null, 1));
+    }
+}
Index: plications/editors/josm/plugins/HouseNumberTaggingTool/test/unit/org/openstreetmap/josm/plugins/housenumbertool/TagDialogTest.java
===================================================================
--- /applications/editors/josm/plugins/HouseNumberTaggingTool/test/unit/org/openstreetmap/josm/plugins/housenumbertool/TagDialogTest.java	(revision 35507)
+++ 	(revision )
@@ -1,27 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.plugins.housenumbertool;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import org.junit.Test;
-
-/**
- * Unit tests of {@link TagDialog}.
- */
-public class TagDialogTest {
-
-    /**
-     * Unit test of {@link TagDialog#incrementHouseNumber}
-     */
-    @Test
-    public void testIncrementHouseNumber() {
-        assertEquals("2", TagDialog.incrementHouseNumber("1", 1));
-        assertEquals("12", TagDialog.incrementHouseNumber("10", 2));
-        assertEquals("2A", TagDialog.incrementHouseNumber("1A", 1));
-        assertEquals("E2", TagDialog.incrementHouseNumber("E1", 1));
-        //assertEquals("۲", TagDialog.incrementHouseNumber("۱", 1)); // FIXME: how to increment persian numbers ?
-        assertEquals("2", TagDialog.incrementHouseNumber("۱", 1));
-        assertNull(TagDialog.incrementHouseNumber(null, 1));
-    }
-}
