diff --git a/terracer/src/org/openstreetmap/josm/plugins/terracer/HouseNumberInputDialog.java b/terracer/src/org/openstreetmap/josm/plugins/terracer/HouseNumberInputDialog.java
index fe78d0647..28d66bd53 100644
--- a/terracer/src/org/openstreetmap/josm/plugins/terracer/HouseNumberInputDialog.java
+++ b/terracer/src/org/openstreetmap/josm/plugins/terracer/HouseNumberInputDialog.java
@@ -94,7 +94,7 @@ public class HouseNumberInputDialog extends ExtendedDialog {
             String buildingType, boolean relationExists, List<Node> houseNumbers) {
         super(MainApplication.getMainFrame(),
                 tr("Terrace a house"),
-                new String[] {tr("OK"), tr("Cancel")},
+                new String[] { tr("Long side"), tr("Short side"), tr("Cancel") },
                 true
         );
         this.inputHandler = handler;
@@ -106,7 +106,7 @@ public class HouseNumberInputDialog extends ExtendedDialog {
         handler.dialog = this;
         JPanel content = getInputPanel();
         setContent(content);
-        setButtonIcons("ok", "cancel");
+        setButtonIcons("ok", "ok", "cancel");
         getJContentPane();
         initialize();
         setDefaultButton(1);
diff --git a/terracer/src/org/openstreetmap/josm/plugins/terracer/HouseNumberInputHandler.java b/terracer/src/org/openstreetmap/josm/plugins/terracer/HouseNumberInputHandler.java
index b1003761b..eafaa212d 100644
--- a/terracer/src/org/openstreetmap/josm/plugins/terracer/HouseNumberInputHandler.java
+++ b/terracer/src/org/openstreetmap/josm/plugins/terracer/HouseNumberInputHandler.java
@@ -128,9 +128,12 @@ public class HouseNumberInputHandler extends JosmAction implements FocusListener
         isOk &= checkNumberStringField(dialog.segments, tr("Segments"),
                         message);
 
-        JButton okButton = getButton(dialog, "OK");
-        if (okButton != null)
-            okButton.setEnabled(isOk);
+        JButton longSideButton = getButton(dialog, tr("Long side"));
+        if (longSideButton != null)
+            longSideButton.setEnabled(isOk);
+        JButton shortSideButton = getButton(dialog, tr("Short side"));
+        if (shortSideButton != null)
+            shortSideButton.setEnabled(isOk);
         if (isOk) {
 
             // For some reason the messageLabel doesn't want to show up
@@ -271,7 +274,7 @@ public class HouseNumberInputHandler extends JosmAction implements FocusListener
         // OK or Cancel button-actions
         if (e.getSource() instanceof JButton) {
             JButton button = (JButton) e.getSource();
-            if (tr("OK").equals(button.getActionCommand()) && button.isEnabled()) {
+            if (tr("Long side").equals(button.getActionCommand()) && button.isEnabled()) {
                 if (validateInput()) {
                     saveValues();
 
@@ -287,7 +290,29 @@ public class HouseNumberInputHandler extends JosmAction implements FocusListener
                         housenumbers,
                         streetName(),
                         doHandleRelation(),
-                        doKeepOutline(), buildingType());
+                        doKeepOutline(), buildingType(),
+                        false);
+
+                    this.dialog.setVisible(false);
+                }
+            } else if (tr("Short side").equals(button.getActionCommand()) && button.isEnabled()) {
+                if (validateInput()) {
+                    saveValues();
+
+                    terracerAction.terraceBuilding(
+                        outline,
+                        init,
+                        street,
+                        associatedStreet,
+                        segments(),
+                        dialog.lo.getText(),
+                        dialog.hi.getText(),
+                        stepSize(),
+                        housenumbers,
+                        streetName(),
+                        doHandleRelation(),
+                        doKeepOutline(), buildingType(),
+                        true);
 
                     this.dialog.setVisible(false);
                 }
diff --git a/terracer/src/org/openstreetmap/josm/plugins/terracer/TerracerAction.java b/terracer/src/org/openstreetmap/josm/plugins/terracer/TerracerAction.java
index 094ff5339..3be7d0c14 100644
--- a/terracer/src/org/openstreetmap/josm/plugins/terracer/TerracerAction.java
+++ b/terracer/src/org/openstreetmap/josm/plugins/terracer/TerracerAction.java
@@ -215,7 +215,7 @@ public final class TerracerAction extends JosmAction {
             // Special case of one outline and one address node.
             // Don't open the dialog
             terraceBuilding(outline, init, street, associatedStreet, 0, null, null, 0,
-                    housenumbers, streetname, associatedStreet != null, false, "yes");
+                    housenumbers, streetname, associatedStreet != null, false, "yes", false);
         } else {
             String title = trn("Change {0} object", "Change {0} objects", sel.size(), sel.size());
             // show input dialog.
@@ -300,10 +300,11 @@ public final class TerracerAction extends JosmAction {
      *        existing relation
      * @param keepOutline If the outline way should be kept
      * @param buildingValue The value for {@code building} key to add
+     * @param invertSide If true, splits on the short side instead of the long side
      */
     public void terraceBuilding(final Way outline, Node init, Way street, Relation associatedStreet, Integer segments,
                 String start, String end, int step, List<Node> housenumbers, String streetName, boolean handleRelations,
-                boolean keepOutline, String buildingValue) {
+                boolean keepOutline, String buildingValue, boolean invertSide) {
         final int nb;
         Integer to;
         Integer from = null;
@@ -326,7 +327,7 @@ public final class TerracerAction extends JosmAction {
         }
 
         // now find which is the longest side connecting the first node
-        Pair<Way, Way> interp = findFrontAndBack(outline);
+        Pair<Way, Way> interp = findFrontAndBack(outline, invertSide);
 
         final boolean swap = init != null && (init.equals(interp.a.lastNode()) || init.equals(interp.b.lastNode()));
 
@@ -595,10 +596,11 @@ public final class TerracerAction extends JosmAction {
      * segments to find the "sides". Sides are assumed to be single segments
      * which cannot be contiguous.
      *
-     * @param w The way to analyse.
+     * @param invertSide If true, forces the use of the alternative (adjacent) pair
+     *                   of sides, effectively rotating the split axis.
      * @return A pair of ways (front, back) pointing in the same directions.
      */
-    private static Pair<Way, Way> findFrontAndBack(Way w) {
+    private static Pair<Way, Way> findFrontAndBack(Way w, boolean invertSide) {
         // calculate the "side-ness" score for each segment of the way
         double[] sideness = calculateSideness(w);
 
@@ -627,6 +629,13 @@ public final class TerracerAction extends JosmAction {
             side2 = (side2 + 1) % (w.getNodesCount() - 1);
         }
 
+        // if inverted, shift the selection to the adjacent segments to use the
+        // alternative pair of sides (e.g. top/bottom instead of left/right).
+        if (invertSide) {
+            side1 = (side1 + 1) % (w.getNodesCount() - 1);
+            side2 = (side2 + 1) % (w.getNodesCount() - 1);
+        }
+
         // swap side1 and side2 into sorted order.
         if (side1 > side2) {
             int tmp = side2;
diff --git a/terracer/target/terracer.jar b/terracer/target/terracer.jar
new file mode 100644
index 000000000..1dac45dbc
Binary files /dev/null and b/terracer/target/terracer.jar differ
diff --git a/terracer/test/unit/org/openstreetmap/josm/plugins/terracer/ReverseTerraceActionTest.java b/terracer/test/unit/org/openstreetmap/josm/plugins/terracer/ReverseTerraceActionTest.java
index cec7bf50a..0269bd3d7 100644
--- a/terracer/test/unit/org/openstreetmap/josm/plugins/terracer/ReverseTerraceActionTest.java
+++ b/terracer/test/unit/org/openstreetmap/josm/plugins/terracer/ReverseTerraceActionTest.java
@@ -51,7 +51,7 @@ class ReverseTerraceActionTest {
         way2.addNode(way2.firstNode());
         dataSet.setSelected(way2);
         new TerracerAction().terraceBuilding(way2, null, null, null, 5,
-                "80", "88", 2, Collections.emptyList(), null, false, false, "apartments");
+                "80", "88", 2, Collections.emptyList(), null, false, false, "apartments", false);
         final List<Way> addressedWays = dataSet.getWays().stream().filter(w -> w != way1)
                 .sorted(Comparator.comparingLong(w -> -w.getUniqueId())).collect(Collectors.toList());
         assertAll("Terrace should work as expected", () -> assertEquals(5, addressedWays.size()),
