diff --git a/test/unit/org/openstreetmap/josm/tools/ShortcutTest.java b/test/unit/org/openstreetmap/josm/tools/ShortcutTest.java
new file mode 100644
index 0000000..30cc636
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/tools/ShortcutTest.java
@@ -0,0 +1,117 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Modifier;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.actions.JosmAction;
+
+public class ShortcutTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init(true);
+    }
+
+    @Test
+    public void testParallelAccess() throws Exception {
+        final Collection<Class> classes = getClasses(JosmAction.class.getPackage().getName());
+        final Collection<Callable<Object>> instantiations = new ArrayList<>(classes.size());
+        final Collection<Future<?>> results = new ArrayList<>(classes.size());
+        for (final Class i : classes) {
+            if (!Modifier.isAbstract(i.getModifiers())) {
+                try {
+                    //noinspection unchecked
+                    i.getConstructor().isAccessible(); // ignore return value
+                } catch (NoSuchMethodException | SecurityException ignore) {
+                    // ignore
+                    continue;
+                }
+                instantiations.add(new Callable<Object>() {
+                    @Override
+                    public Object call() throws Exception {
+                        System.out.println(System.currentTimeMillis() + " " + i);
+                        return i.newInstance();
+                    }
+                });
+            }
+        }
+        final ExecutorService executor = Executors.newFixedThreadPool(classes.size());
+        System.out.println("Initializing " + instantiations.size() + " actions");
+        for (Callable<Object> i : instantiations) {
+            results.add(executor.submit(i));
+        }
+        for (Future<?> i : results) {
+            i.get();
+        }
+        executor.shutdown();
+    }
+
+    /**
+     * Scans all classes accessible from the context class loader which belong to the given package and subpackages.
+     *
+     * @param packageName The base package
+     * @return The classes
+     * @throws ClassNotFoundException
+     * @throws IOException
+     */
+    private static Collection<Class> getClasses(String packageName) throws ClassNotFoundException, IOException {
+        // from https://dzone.com/articles/get-all-classes-within-package
+        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+        assert classLoader != null;
+        String path = packageName.replace('.', '/');
+        Enumeration<URL> resources = classLoader.getResources(path);
+        Collection<File> dirs = new ArrayList<>();
+        while (resources.hasMoreElements()) {
+            URL resource = resources.nextElement();
+            dirs.add(new File(resource.getFile()));
+        }
+        Collection<Class> classes = new ArrayList<>();
+        for (File directory : dirs) {
+            classes.addAll(findClasses(directory, packageName));
+        }
+        return classes;
+    }
+
+    /**
+     * Recursive method used to find all classes in a given directory and subdirs.
+     *
+     * @param directory   The base directory
+     * @param packageName The package name for classes found inside the base directory
+     * @return The classes
+     * @throws ClassNotFoundException
+     */
+    private static Collection<Class> findClasses(File directory, String packageName) throws ClassNotFoundException {
+        // from https://dzone.com/articles/get-all-classes-within-package
+        Collection<Class> classes = new ArrayList<>();
+        if (!directory.exists()) {
+            return classes;
+        }
+        File[] files = directory.listFiles();
+        assert files != null;
+        for (File file : files) {
+            if (file.isDirectory()) {
+                assert !file.getName().contains(".");
+                classes.addAll(findClasses(file, packageName + "." + file.getName()));
+            } else if (file.getName().endsWith(".class")) {
+                classes.add(Class.forName(packageName + '.' + file.getName().substring(0, file.getName().length() - 6)));
+            }
+        }
+        return classes;
+    }
+}
