Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/SimilarNamedWays.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/SimilarNamedWays.java	(revision 15078)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/SimilarNamedWays.java	(revision 15079)
@@ -245,5 +245,7 @@
             for (int i = 0; i < words.length; i++) {
                 String word = words[i];
-                part = name.substring(start, start + word.length());
+                if (start + word.length() <= name.length()) {
+                    part = name.substring(start, start + word.length());
+                }
                 if (word.equalsIgnoreCase(part)) {
                     break;
Index: /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/SimilarNamedWaysTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/SimilarNamedWaysTest.java	(revision 15078)
+++ /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/SimilarNamedWaysTest.java	(revision 15079)
@@ -130,3 +130,11 @@
         checkSimilarity("case only", "Rue éèçàïù", "Rue EeCAIU", true);
     }
+
+     /**
+      * Test names that previously caused a crash
+      */
+     @Test
+     public void testSimilarNamesRegression() {
+         assertFalse(test.similaryName("Unnecessary Name", "Third"));
+     }
 }
