Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillaryImageInfoDownloadThread.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillaryImageInfoDownloadThread.java	(revision 32067)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillaryImageInfoDownloadThread.java	(revision 32069)
@@ -46,5 +46,7 @@
   public void run() {
     try (
-      BufferedReader br = new BufferedReader(new InputStreamReader(MapillaryURL.searchImageURL(bounds, page).openStream(), "UTF-8"));
+      BufferedReader br = new BufferedReader(new InputStreamReader(
+          MapillaryURL.searchImageInfoURL(bounds, page, null).openStream(), "UTF-8"
+      ));
     ) {
       JsonObject jsonobj = Json.createReader(br).readObject();
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillarySequenceDownloadThread.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillarySequenceDownloadThread.java	(revision 32067)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillarySequenceDownloadThread.java	(revision 32069)
@@ -53,8 +53,7 @@
   public void run() {
     try (
-            BufferedReader br = new BufferedReader(new InputStreamReader(
-                    MapillaryURL.searchSequenceURL(bounds, page).openStream(),
-                    "UTF-8"
-            ));
+        BufferedReader br = new BufferedReader(new InputStreamReader(
+            MapillaryURL.searchSequenceURL(bounds, page).openStream(), "UTF-8"
+        ));
     ) {
       JsonObject jsonall = Json.createReader(br).readObject();
@@ -121,5 +120,8 @@
       }
     } catch (IOException e) {
-      Main.error("Error reading the url " + MapillaryURL.searchSequenceURL(bounds, page) + " might be a Mapillary problem.", e);
+      Main.error(String.format(
+          "Error reading the url %s, this might be a Mapillary problem.",
+          MapillaryURL.searchSequenceURL(bounds, page)
+      ), e);
     }
     MapillaryData.dataUpdated();
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillaryTrafficSignDownloadThread.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillaryTrafficSignDownloadThread.java	(revision 32067)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillaryTrafficSignDownloadThread.java	(revision 32069)
@@ -18,4 +18,5 @@
 import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
 import org.openstreetmap.josm.plugins.mapillary.utils.MapillaryURL;
+import org.openstreetmap.josm.plugins.mapillary.utils.MapillaryURL.IMAGE_SELECTOR;
 
 /**
@@ -48,5 +49,5 @@
     try (
       BufferedReader br = new BufferedReader(new InputStreamReader(
-        MapillaryURL.searchTrafficSignURL(bounds, page).openStream(), "UTF-8"
+        MapillaryURL.searchImageInfoURL(bounds, page, IMAGE_SELECTOR.OBJ_REC_ONLY).openStream(), "UTF-8"
       ));
     ) {
@@ -78,7 +79,9 @@
           for (int j = 0; j < rects.size(); j++) {
             JsonObject data = rects.getJsonObject(j);
-            for (MapillaryAbstractImage image : MapillaryLayer.getInstance().getData().getImages())
-              if (image instanceof MapillaryImage && ((MapillaryImage) image).getKey().equals(key))
+            for (MapillaryAbstractImage image : MapillaryLayer.getInstance().getData().getImages()) {
+              if (image instanceof MapillaryImage && ((MapillaryImage) image).getKey().equals(key)) {
                 ((MapillaryImage) image).addSign(data.getString("type"));
+              }
+            }
           }
         }
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/utils/MapillaryURL.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/utils/MapillaryURL.java	(revision 32067)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/utils/MapillaryURL.java	(revision 32069)
@@ -20,4 +20,8 @@
   private static final String BASE_WEBSITE_URL = "https://www.mapillary.com/";
 
+  public enum IMAGE_SELECTOR {
+    BLURRED_ONLY, COMMENTED_ONLY, OBJ_REC_ONLY // null is used when all images should be selected
+  }
+
   private MapillaryURL() {
     // Private constructor to avoid instantiation
@@ -33,5 +37,5 @@
   public static URL browseEditURL(String imgKey) {
     ValidationUtil.throwExceptionForInvalidImgKey(imgKey, false);
-    return string2URL(BASE_WEBSITE_URL + "map/e/" + imgKey);
+    return string2URL(BASE_WEBSITE_URL, "map/e/", imgKey);
   }
 
@@ -45,5 +49,5 @@
   public static URL browseImageURL(String key) {
     ValidationUtil.throwExceptionForInvalidImgKey(key, false);
-    return string2URL(BASE_WEBSITE_URL + "map/im/" + key);
+    return string2URL(BASE_WEBSITE_URL, "map/im/", key);
   }
 
@@ -52,5 +56,5 @@
    */
   public static URL browseUploadImageURL() {
-    return string2URL(BASE_WEBSITE_URL + "map/upload/im/");
+    return string2URL(BASE_WEBSITE_URL, "map/upload/im");
   }
 
@@ -67,5 +71,5 @@
     parts.put("response_type", "token");
     parts.put("scope", "user:read public:upload public:write");
-    return string2URL(BASE_WEBSITE_URL + "connect"+queryString(parts));
+    return string2URL(BASE_WEBSITE_URL, "connect", queryString(parts));
   }
 
@@ -75,12 +79,30 @@
    * @param bounds the bounds in which you want to search for images
    * @param page number of the page to retrieve from the API
+   * @param selector
    * @return the API-URL which gives you the images in the given bounds as JSON
    */
-  public static URL searchImageURL(Bounds bounds, int page) {
+  public static URL searchImageInfoURL(Bounds bounds, int page, IMAGE_SELECTOR selector) {
+    String selectorString = "";
+    if (selector != null) {
+      switch (selector) {
+      case BLURRED_ONLY:
+        selectorString = "/b";
+        break;
+      case COMMENTED_ONLY:
+        selectorString = "/cm";
+        break;
+      case OBJ_REC_ONLY:
+        selectorString = "/or";
+        break;
+      default:
+        selectorString = "";
+        break;
+      }
+    }
     HashMap<String, String> parts = new HashMap<>();
     putBoundsInQueryStringParts(parts, bounds);
     parts.put("page", Integer.toString(page));
     parts.put("limit", "20");
-    return string2URL(BASE_API_URL + "search/im/" + queryString(parts));
+    return string2URL(BASE_API_URL, "search/im", selectorString, queryString(parts));
   }
 
@@ -97,20 +119,5 @@
     parts.put("page", Integer.toString(page));
     parts.put("limit", "10");
-    return string2URL(BASE_API_URL + "search/s/" + queryString(parts));
-  }
-
-  /**
-   * Gives you the API-URL where you get the traffic signs for 20 images within the given bounds.
-   * For the signs from more than 20 images you have to use different URLs with different page numbers.
-   * @param bounds the bounds in which you want to search for traffic signs
-   * @param page number of the page to retrieve from the API
-   * @return the API-URL which gives you the traffic signs in the given bounds as JSON
-   */
-  public static URL searchTrafficSignURL(Bounds bounds, int page) {
-    HashMap<String, String> parts = new HashMap<>();
-    putBoundsInQueryStringParts(parts, bounds);
-    parts.put("page", Integer.toString(page));
-    parts.put("limit", "20");
-    return string2URL(BASE_API_URL + "search/im/or/" + queryString(parts));
+    return string2URL(BASE_API_URL, "search/s", queryString(parts));
   }
 
@@ -119,5 +126,5 @@
    */
   public static URL uploadSecretsURL() {
-    return string2URL(BASE_API_URL + "me/uploads/secrets/" + queryString(null));
+    return string2URL(BASE_API_URL, "me/uploads/secrets", queryString(null));
   }
 
@@ -126,5 +133,5 @@
    */
   public static URL userURL() {
-    return string2URL(BASE_API_URL + "me/" + queryString(null));
+    return string2URL(BASE_API_URL, "me", queryString(null));
   }
 
@@ -172,9 +179,17 @@
    * @return the URL that is constructed from the given string
    */
-  private static URL string2URL(String string) {
+  private static URL string2URL(String... strings) {
+    StringBuilder builder = new StringBuilder();
+    for (int i = 0; strings != null && i < strings.length; i++) {
+      builder.append(strings[i]);
+    }
     try {
-      return new URL(string);
+      return new URL(builder.toString());
     } catch (MalformedURLException e) {
-      Main.error(new Exception("The "+MapillaryURL.class.getSimpleName()+" class produces malformed URLs!", e));
+      Main.error(new Exception(String.format(
+          "The class '%s' produces malformed URLs like '%s'!",
+          MapillaryURL.class.getName(),
+          builder
+      ), e));
       return null;
     }
