Index: src/org/openstreetmap/josm/actions/AlignInCircleAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 18293)
+++ src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(working copy)
@@ -31,8 +31,7 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon;
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.JoinedWay;
-import org.openstreetmap.josm.data.validation.tests.CrossingWays;
-import org.openstreetmap.josm.data.validation.tests.SelfIntersectingWay;
+import org.openstreetmap.josm.data.validation.OsmValidator;
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.tools.Geometry;
 import org.openstreetmap.josm.tools.Logging;
@@ -327,9 +326,7 @@
         }
 
         try {
-            if (CrossingWays.isSelfCrossing(test))
-                return false;
-            return !SelfIntersectingWay.isSelfIntersecting(test);
+            return OsmValidator.validateGeometry(test, false);
         } finally {
             test.setNodes(null); // see #19855
         }
Index: src/org/openstreetmap/josm/actions/CombineWayAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 18293)
+++ src/org/openstreetmap/josm/actions/CombineWayAction.java	(working copy)
@@ -37,9 +37,7 @@
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon;
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.JoinedWay;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
-import org.openstreetmap.josm.data.validation.Test;
-import org.openstreetmap.josm.data.validation.tests.OverlappingWays;
-import org.openstreetmap.josm.data.validation.tests.SelfIntersectingWay;
+import org.openstreetmap.josm.data.validation.OsmValidator;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.Notification;
@@ -307,22 +305,7 @@
 
         final Way selectedWay = combineResult.a;
         UndoRedoHandler.getInstance().add(combineResult.b);
-        Test test = new OverlappingWays();
-        test.startTest(null);
-        test.visit(combineResult.a);
-        test.endTest();
-        if (test.getErrors().isEmpty()) {
-            test = new SelfIntersectingWay();
-            test.startTest(null);
-            test.visit(combineResult.a);
-            test.endTest();
-        }
-        if (!test.getErrors().isEmpty()) {
-            new Notification(test.getErrors().get(0).getMessage())
-            .setIcon(JOptionPane.WARNING_MESSAGE)
-            .setDuration(Notification.TIME_SHORT)
-            .show();
-        }
+        OsmValidator.validateGeometry(selectedWay, true);
         if (selectedWay != null) {
             GuiHelper.runInEDT(() -> ds.setSelected(selectedWay));
         }
Index: src/org/openstreetmap/josm/data/validation/OsmValidator.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 18293)
+++ src/org/openstreetmap/josm/data/validation/OsmValidator.java	(working copy)
@@ -35,6 +35,7 @@
 import javax.swing.tree.TreeModel;
 import javax.swing.tree.TreeNode;
 
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.preferences.sources.ValidatorPrefHelper;
 import org.openstreetmap.josm.data.projection.ProjectionRegistry;
 import org.openstreetmap.josm.data.validation.tests.Addresses;
@@ -44,6 +45,7 @@
 import org.openstreetmap.josm.data.validation.tests.ConditionalKeys;
 import org.openstreetmap.josm.data.validation.tests.ConnectivityRelations;
 import org.openstreetmap.josm.data.validation.tests.CrossingWays;
+import org.openstreetmap.josm.data.validation.tests.CrossingWays.SelfCrossing;
 import org.openstreetmap.josm.data.validation.tests.DirectionNodes;
 import org.openstreetmap.josm.data.validation.tests.DuplicateNode;
 import org.openstreetmap.josm.data.validation.tests.DuplicateRelation;
@@ -74,6 +76,7 @@
 import org.openstreetmap.josm.data.validation.tests.WayConnectedToArea;
 import org.openstreetmap.josm.data.validation.tests.WronglyOrderedWays;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.gui.layer.ValidatorLayer;
 import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -695,4 +698,41 @@
     static void clearIgnoredErrors() {
         ignoredErrors.clear();
     }
+
+    /**
+     * Execute geometry tests {@link OverlappingWays}, {@link SelfCrossing},
+     * and {@link SelfIntersectingWay} on a given way.
+     * @param way the way to test
+     * @param showNotification if set to {@code true} and an error was found show the corresponding message
+     * @return {@code true} if no error was found, else {@code false}
+     * @since xxx
+     */
+    public static boolean validateGeometry(Way way, boolean showNotification) {
+        Test test = new OverlappingWays();
+        test.startTest(null);
+        test.visit(way);
+        test.endTest();
+        if (test.getErrors().isEmpty()) {
+            test = new SelfCrossing();
+            test.startTest(null);
+            test.visit(way);
+            test.endTest();
+        }
+        if (test.getErrors().isEmpty()) {
+            test = new SelfIntersectingWay();
+            test.startTest(null);
+            test.visit(way);
+            test.endTest();
+        }
+        if (!test.getErrors().isEmpty()) {
+            if (showNotification) {
+                new Notification(test.getErrors().get(0).getMessage())
+                .setIcon(JOptionPane.WARNING_MESSAGE)
+                .setDuration(Notification.TIME_SHORT)
+                .show();
+            }
+            return false;
+        }
+        return true;
+    }
 }
