diff --git a/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/Dto.java b/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/Dto.java
index cf530825f..b7037dc51 100644
--- a/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/Dto.java
+++ b/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/Dto.java
@@ -22,6 +22,7 @@ public class Dto implements Serializable {
     private boolean saveHousenumber = true;
 
     private boolean tagStreet = true; // use tag addr:street or addr:place
+    private boolean incrementSuffix = false; // increment 1a, 1b, ... instead of 1, 2, ...
    
     private String building = "yes";
     private String source;
@@ -163,6 +164,14 @@ public class Dto implements Serializable {
         this.tagStreet = tagStreet;
     }
 
+    public boolean isIncrementSuffix() {
+        return incrementSuffix;
+    }
+
+    public void setIncrementSuffix(boolean incrementSuffix) {
+        this.incrementSuffix = incrementSuffix;
+    }
+
     public String getPlace() {
         return place;
     }
diff --git a/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberHelper.java b/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberHelper.java
index 1690c9091..c2b744569 100644
--- a/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberHelper.java
+++ b/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberHelper.java
@@ -10,6 +10,11 @@ import org.openstreetmap.josm.tools.Logging;
  * A helper class for incrementing addr:housenumber
  */
 public final class HouseNumberHelper {
+    /**
+     * prefix, number, separator, letter suffix, number suffix, e.g. "12a", "12/1", "12-b"
+     */
+    private static final Pattern HOUSE_NUMBER_PATTERN = Pattern.compile("([^\\pN]+)?(\\pN+)([-/ ])?([^\\pN]+)?(\\pN+)?");
+
     private HouseNumberHelper() {
         // Hide constructor
     }
@@ -23,12 +28,10 @@ public final class HouseNumberHelper {
     public static String incrementHouseNumber(String number, int increment) {
         if (number != null) {
             try {
-                Matcher m = Pattern.compile("([^\\pN]+)?(\\pN+)([^\\pN]+)?").matcher(number);
+                Matcher m = HOUSE_NUMBER_PATTERN.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;
+                    return number.substring(0, m.start(2)) + n + number.substring(m.end(2));
                 }
             } catch (NumberFormatException e) {
                 Logging.trace(e);
@@ -36,4 +39,57 @@ public final class HouseNumberHelper {
         }
         return null;
     }
+
+    /**
+     * Increment the suffix of a house number, e.g. 1 to 1a, 1a to 1b or 1/1 to 1/2
+     * @param number The number to increment
+     * @return The incremented number
+     */
+    public static String incrementHouseNumberSuffix(String number) {
+        if (number != null) {
+            try {
+                Matcher m = HOUSE_NUMBER_PATTERN.matcher(number);
+                if (m.matches()) {
+                    String letter = m.group(4);
+                    String suffixNumber = m.group(5);
+                    if (suffixNumber != null) {
+                        int n = Integer.parseInt(suffixNumber) + 1;
+                        return number.substring(0, m.start(5)) + n;
+                    } else if (letter != null) {
+                        char next = (char) (letter.charAt(letter.length() - 1) + 1);
+                        return number.substring(0, m.end(4) - 1) + next;
+                    } else {
+                        return number + "a";
+                    }
+                }
+            } catch (NumberFormatException e) {
+                Logging.trace(e);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Check if a house number has a suffix like 1a or 1/1
+     * @param number The house number
+     * @return {@code true} if the number has a suffix
+     */
+    public static boolean hasSuffix(String number) {
+        return number != null && !number.equals(removeSuffix(number));
+    }
+
+    /**
+     * Remove the suffix of a house number, e.g. 1a to 1
+     * @param number The house number
+     * @return The number without suffix
+     */
+    public static String removeSuffix(String number) {
+        if (number != null) {
+            Matcher m = HOUSE_NUMBER_PATTERN.matcher(number);
+            if (m.matches()) {
+                return number.substring(0, m.end(2));
+            }
+        }
+        return number;
+    }
 }
diff --git a/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberTaggingToolPlugin.java b/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberTaggingToolPlugin.java
index b189e45a4..aa6cea477 100644
--- a/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberTaggingToolPlugin.java
+++ b/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberTaggingToolPlugin.java
@@ -1,6 +1,8 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.plugins.housenumbertool;
 
+import java.io.File;
+
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.plugins.Plugin;
@@ -8,6 +10,7 @@ import org.openstreetmap.josm.plugins.PluginInformation;
 
 /**
  * Simple tool to tag house numbers. Select house and press 'k'. Select your addr-tags and press OK.
+ * Press 'shift+k' to switch between incrementing the number and the suffix.
  */
 public class HouseNumberTaggingToolPlugin extends Plugin {
 
@@ -17,7 +20,8 @@ public class HouseNumberTaggingToolPlugin extends Plugin {
      */
     public HouseNumberTaggingToolPlugin(PluginInformation info) {
         super(info);
-        LaunchAction action = new LaunchAction(getPluginDirs().getUserDataDirectory(false));
-        MainMenu.add(MainApplication.getMenu().dataMenu, action, false, 0);
+        File pluginDir = getPluginDirs().getUserDataDirectory(false);
+        MainMenu.add(MainApplication.getMenu().dataMenu, new LaunchAction(pluginDir), false, 0);
+        MainMenu.add(MainApplication.getMenu().dataMenu, new LaunchAction(pluginDir, true), false, 1);
     }
 }
diff --git a/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/LaunchAction.java b/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/LaunchAction.java
index b6a49b3c3..400aa9ffe 100644
--- a/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/LaunchAction.java
+++ b/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/LaunchAction.java
@@ -23,20 +23,35 @@ public class LaunchAction extends JosmAction implements DataSelectionListener {
     private OsmPrimitive selection;
 
     private final File pluginDir;
+    private final boolean switchIncrement;
 
     /**
      * Constructs a new {@code LaunchAction}.
      * @param pluginDir plugin directory
      */
     public LaunchAction(File pluginDir) {
-        super(tr("HouseNumberTaggingTool"),
+        this(pluginDir, false);
+    }
+
+    /**
+     * Constructs a new {@code LaunchAction}.
+     * @param pluginDir plugin directory
+     * @param switchIncrement if {@code true}, switch between incrementing the number and the suffix,
+     * e.g. 1 to 1a or 1c to 2 (shortcut Shift+K)
+     */
+    public LaunchAction(File pluginDir, boolean switchIncrement) {
+        super(switchIncrement ? tr("HouseNumberTaggingTool (switch number/suffix)") : tr("HouseNumberTaggingTool"),
               "home-icon32", 
               tr("Launches the HouseNumberTaggingTool dialog"),
-              Shortcut.registerShortcut("edit:housenumbertaggingtool", tr("Data: {0}", "HouseNumberTaggingTool"),
-                KeyEvent.VK_K, Shortcut.DIRECT),
+              switchIncrement
+                ? Shortcut.registerShortcut("edit:housenumbertaggingtool:switch",
+                    tr("Data: {0}", tr("HouseNumberTaggingTool (switch number/suffix)")), KeyEvent.VK_K, Shortcut.SHIFT)
+                : Shortcut.registerShortcut("edit:housenumbertaggingtool", tr("Data: {0}", "HouseNumberTaggingTool"),
+                    KeyEvent.VK_K, Shortcut.DIRECT),
               true);
 
         this.pluginDir = pluginDir;
+        this.switchIncrement = switchIncrement;
         SelectionEventManager.getInstance().addSelectionListener(this);
         setEnabled(false);
     }
@@ -49,7 +64,7 @@ public class LaunchAction extends JosmAction implements DataSelectionListener {
             return;
         }
       
-        TagDialog dialog = new TagDialog(pluginDir, selection);
+        TagDialog dialog = new TagDialog(pluginDir, selection, switchIncrement);
         dialog.showDialog();
     }
 
diff --git a/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/TagDialog.java b/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/TagDialog.java
index 7b9864a0f..917a44c58 100644
--- a/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/TagDialog.java
+++ b/HouseNumberTaggingTool/src/org/openstreetmap/josm/plugins/housenumbertool/TagDialog.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
 
+import javax.swing.Box;
 import javax.swing.ButtonGroup;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
@@ -110,6 +111,9 @@ public class TagDialog extends ExtendedDialog {
     private JComboBox<String> building;
     private JRadioButton streetRadio;
     private JRadioButton placeRadio;
+    private JRadioButton incrementNumberRadio;
+    private JRadioButton incrementSuffixRadio;
+    private final boolean switchIncrement;
 
     /**
      * Constructs a new {@code TagDialog}.
@@ -117,14 +121,25 @@ public class TagDialog extends ExtendedDialog {
      * @param selection selected primitive
      */
     public TagDialog(File pluginDir, OsmPrimitive selection) {
+        this(pluginDir, selection, false);
+    }
+
+    /**
+     * Constructs a new {@code TagDialog}.
+     * @param pluginDir plugin directory
+     * @param selection selected primitive
+     * @param switchIncrement if {@code true}, switch between incrementing the number and the suffix
+     */
+    public TagDialog(File pluginDir, OsmPrimitive selection, boolean switchIncrement) {
         super(MainApplication.getMainFrame(), tr("House Number Editor"), new String[] {tr("OK"), tr("Cancel")}, true);
         this.pluginDir = pluginDir;
         this.selection = selection;
+        this.switchIncrement = switchIncrement;
 
         JPanel editPanel = createContentPane();
 
-        setPreferredSize(new Dimension(900, 500));
-        setMinimumSize(new Dimension(900, 500));
+        setPreferredSize(new Dimension(900, 550));
+        setMinimumSize(new Dimension(900, 550));
 
         setContent(editPanel);
         setButtonIcons("ok", "cancel");
@@ -283,7 +298,19 @@ public class TagDialog extends ExtendedDialog {
         housenumberEnabled = generateCheckbox(TAG_ADDR_HOUSENUMBER, dto.isSaveHousenumber());
         editPanel.add(housenumberEnabled, columnOne);
 
-        housenumber = generateTextField(HouseNumberHelper.incrementHouseNumber(dto.getHousenumber(), dto.getHousenumberChangeValue()));
+        String lastNumber = dto.getHousenumber();
+        boolean incrementSuffix = dto.isIncrementSuffix();
+        if (switchIncrement) {
+            incrementSuffix = !HouseNumberHelper.hasSuffix(lastNumber);
+            if (!incrementSuffix) {
+                lastNumber = HouseNumberHelper.removeSuffix(lastNumber);
+            }
+        }
+        if (incrementSuffix) {
+            housenumber = generateTextField(HouseNumberHelper.incrementHouseNumberSuffix(lastNumber));
+        } else {
+            housenumber = generateTextField(HouseNumberHelper.incrementHouseNumber(lastNumber, dto.getHousenumberChangeValue()));
+        }
         housenumber.setEditable(true);
 
         editPanel.add(housenumber, columnTwo);
@@ -291,6 +318,22 @@ public class TagDialog extends ExtendedDialog {
         editPanel.add(generateAcceptButton(actionEvent -> housenumber.setText(selection.get(TAG_ADDR_HOUSENUMBER))), columnThree);
         editPanel.add(generateTextField(selection.get(TAG_ADDR_HOUSENUMBER)), columnFour);
 
+        // increment number or suffix
+        incrementNumberRadio = new JRadioButton(tr("Increment number"));
+        incrementNumberRadio.setSelected(!incrementSuffix);
+
+        incrementSuffixRadio = new JRadioButton(tr("Increment suffix"));
+        incrementSuffixRadio.setToolTipText(tr("Increment letter or number suffixes, e.g. 1a or 1/1"));
+        incrementSuffixRadio.setSelected(incrementSuffix);
+
+        ButtonGroup incrementGroup = new ButtonGroup();
+        incrementGroup.add(incrementNumberRadio);
+        incrementGroup.add(incrementSuffixRadio);
+
+        editPanel.add(Box.createHorizontalGlue(), GBC.std());
+        editPanel.add(incrementNumberRadio, GBC.std().insets(5, 5, 0, 5));
+        editPanel.add(incrementSuffixRadio, GBC.eol().insets(5, 5, 0, 5));
+
         // increment
         JLabel seqLabel = new JLabel(tr("House number increment:"));
         editPanel.add(seqLabel, columnOne);
@@ -410,6 +453,7 @@ public class TagDialog extends ExtendedDialog {
             dto.setSaveStreet(streetEnabled.isSelected());
             dto.setTagStreet(streetRadio.isSelected());
             dto.setSaveSuburb(suburbEnabled.isSelected());
+            dto.setIncrementSuffix(incrementSuffixRadio.isSelected());
 
             dto.setBuilding((String) building.getSelectedItem());
             dto.setSource(getAutoCompletingComboBoxValue(source));
diff --git a/HouseNumberTaggingTool/test/unit/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberHelperTest.java b/HouseNumberTaggingTool/test/unit/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberHelperTest.java
index 5bee703c6..bb0941431 100644
--- a/HouseNumberTaggingTool/test/unit/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberHelperTest.java
+++ b/HouseNumberTaggingTool/test/unit/org/openstreetmap/josm/plugins/housenumbertool/HouseNumberHelperTest.java
@@ -3,7 +3,9 @@ package org.openstreetmap.josm.plugins.housenumbertool;
 
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.junit.jupiter.api.Test;
 
@@ -24,5 +26,35 @@ class HouseNumberHelperTest {
         //assertEquals("۲", HouseNumberHelper.incrementHouseNumber("۱", 1)); // FIXME: how to increment persian numbers ?
         assertEquals("2", HouseNumberHelper.incrementHouseNumber("۱", 1));
         assertNull(HouseNumberHelper.incrementHouseNumber(null, 1));
+        assertEquals("2/1", HouseNumberHelper.incrementHouseNumber("1/1", 1));
+    }
+
+    /**
+     * Unit test of {@link HouseNumberHelper#incrementHouseNumberSuffix}
+     */
+    @Test
+    void testIncrementHouseNumberSuffix() {
+        assertEquals("1a", HouseNumberHelper.incrementHouseNumberSuffix("1"));
+        assertEquals("1b", HouseNumberHelper.incrementHouseNumberSuffix("1a"));
+        assertEquals("1B", HouseNumberHelper.incrementHouseNumberSuffix("1A"));
+        assertEquals("1-b", HouseNumberHelper.incrementHouseNumberSuffix("1-a"));
+        assertEquals("1/2", HouseNumberHelper.incrementHouseNumberSuffix("1/1"));
+        assertEquals("E1b", HouseNumberHelper.incrementHouseNumberSuffix("E1a"));
+        assertNull(HouseNumberHelper.incrementHouseNumberSuffix(null));
+    }
+
+    /**
+     * Unit test of {@link HouseNumberHelper#hasSuffix} and {@link HouseNumberHelper#removeSuffix}
+     */
+    @Test
+    void testRemoveSuffix() {
+        assertFalse(HouseNumberHelper.hasSuffix("1"));
+        assertFalse(HouseNumberHelper.hasSuffix("E1"));
+        assertTrue(HouseNumberHelper.hasSuffix("1a"));
+        assertTrue(HouseNumberHelper.hasSuffix("1/1"));
+        assertFalse(HouseNumberHelper.hasSuffix(null));
+        assertEquals("1", HouseNumberHelper.removeSuffix("1a"));
+        assertEquals("1", HouseNumberHelper.removeSuffix("1-1"));
+        assertEquals("E1", HouseNumberHelper.removeSuffix("E1a"));
     }
 }
