Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryImage.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryImage.java	(revision 32971)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryImage.java	(revision 32972)
@@ -16,11 +16,19 @@
  */
 public class MapillaryImage extends MapillaryAbstractImage {
-  /** Unique identifier of the object. */
+  /**
+   * Unique identifier of the object.
+   */
   private final String key;
-  /** The user that made the image. */
+  /**
+   * The user that made the image.
+   */
   private String user;
-  /** Set of traffic signs in the image. */
-  private final List<String> signs = new ArrayList<>();
-  /** Where the picture was taken. */
+  /**
+   * Set of traffic signs in the image.
+   */
+  private final List<MapillarySign> signs = new ArrayList<>();
+  /**
+   * Where the picture was taken.
+   */
   private String location;
 
@@ -28,7 +36,7 @@
    * Main constructor of the class MapillaryImage
    *
-   * @param key The unique identifier of the image.
+   * @param key    The unique identifier of the image.
    * @param latLon The latitude and longitude where it is positioned.
-   * @param ca The direction of the images in degrees, meaning 0 north.
+   * @param ca     The direction of the images in degrees, meaning 0 north.
    */
   public MapillaryImage(final String key, final LatLon latLon, final double ca) {
@@ -70,6 +78,8 @@
    * @param sign A {@code String} that identifies the type of sign.
    */
-  public void addSign(String sign) {
-    this.signs.add(sign);
+  public void addSign(MapillarySign sign) {
+    if (sign != null) {
+      this.signs.add(sign);
+    }
   }
 
@@ -79,5 +89,5 @@
    * @return A {@link List} object containing the signs assigned to this image.
    */
-  public List<String> getSigns() {
+  public List<MapillarySign> getSigns() {
     return this.signs;
   }
@@ -104,6 +114,6 @@
   public String toString() {
     return String.format(
-      "Image[key=%s,lat=%f,lon=%f,ca=%f,location=%s,user=%s,capturedAt=%d]",
-      key, latLon.lat(), latLon.lon(), ca, location, user, capturedAt
+            "Image[key=%s,lat=%f,lon=%f,ca=%f,location=%s,user=%s,capturedAt=%d]",
+            key, latLon.lat(), latLon.lon(), ca, location, user, capturedAt
     );
   }
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillarySign.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillarySign.java	(revision 32972)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillarySign.java	(revision 32972)
@@ -0,0 +1,123 @@
+package org.openstreetmap.josm.plugins.mapillary;
+
+import org.openstreetmap.josm.Main;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * Created by nokutu on 30/07/16.
+ */
+public class MapillarySign {
+
+  private final static String[] COUNTRIES = {"au", "br", "ca", "eu", "us"};
+
+  private static Map<String, HashMap<String, MapillarySign>> map;
+
+  private final String fullName;
+  private final String category;
+  private final String type;
+  private final String country;
+  private String variant;
+
+  static {
+    map = new HashMap<>();
+    for (String country : COUNTRIES) {
+      HashMap<String, MapillarySign> countryMap = new HashMap<>();
+      try (
+              BufferedReader br = new BufferedReader(new InputStreamReader(
+                      MapillarySign.class.getResourceAsStream("/data/signs/" + country + ".cson")
+              ));
+      ) {
+        String line = "";
+        while ((line = br.readLine()) != null) {
+          if (!line.equals("")) {
+            String[] pair = line.replace("'", "").split(":");
+            countryMap.put(pair[0].trim(), new MapillarySign(pair[1].trim()));
+          }
+        }
+        map.put(country, countryMap);
+
+        br.close();
+      } catch (IOException e) {
+        Main.error(e);
+      }
+    }
+  }
+
+  public static MapillarySign getSign(String name, String country) {
+    Map<String, MapillarySign> countryMap = map.get(country);
+    if (countryMap == null) {
+      throw new IllegalArgumentException("Country does not exist");
+    }
+    if (countryMap.containsKey(name)) {
+      return countryMap.get(name);
+    } else {
+      if (name.split("--").length >= 3 && countryMap.containsValue(new MapillarySign(name))) {
+        Optional<MapillarySign> p = countryMap.values().stream().filter(sign -> sign.toString().equals(name)).findFirst();
+        assert p.isPresent();
+        return p.get();
+      } else {
+        Main.warn("Sign '" + name + "' does not exist in the plugin database. Please contanct the developer to add it.");
+        return null;
+      }
+    }
+  }
+
+  public MapillarySign(String fullName) {
+    Main.info(fullName);
+    this.fullName = fullName;
+    String[] parts = fullName.split("--");
+    category = parts[0];
+    type = parts[1];
+    country = parts[2];
+    if (parts.length == 4) {
+      variant = parts[3];
+    }
+  }
+
+  public String getFullName() {
+    return fullName;
+  }
+
+  public String getCategory() {
+    return category;
+  }
+
+  public String getType() {
+    return type;
+  }
+
+  public String getCountry() {
+    return country;
+  }
+
+  public String getVariant() {
+    return variant;
+  }
+
+  @Override
+  public String toString() {
+    return fullName;
+  }
+
+  @Override
+  public int hashCode() {
+    return fullName.hashCode();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+
+    MapillarySign that = (MapillarySign) o;
+
+    return fullName.equals(that.fullName);
+
+  }
+}
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryFilterDialog.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryFilterDialog.java	(revision 32971)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryFilterDialog.java	(revision 32972)
@@ -11,4 +11,5 @@
 import java.util.Arrays;
 import java.util.Calendar;
+import java.util.regex.Pattern;
 
 import javax.swing.AbstractAction;
@@ -32,4 +33,5 @@
 import org.openstreetmap.josm.plugins.mapillary.MapillaryImportedImage;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
+import org.openstreetmap.josm.plugins.mapillary.MapillarySign;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -69,12 +71,10 @@
    * The list of sign names
    */
-  private static final String[] SIGN_TAGS = {"prohibitory_speed_limit",
-          "priority_stop", "other_give_way", "mandatory_roundabout",
-          "other_no_entry", "prohibitory_no_traffic_both_ways",
-          "danger_intersection", "mandatory_go", "mandatory_keep",
-          "danger_priority_next_intersection", "danger_uneven_road",
-          "prohibitory_no_parking", "prohibitory_on_overtaking",
-          "danger_pedestrian_crossing", "prohibitory_no_u_turn",
-          "prohibitory_noturn"};
+  private static final String[] SIGN_TAGS = {"prohibitory--maximum-speed-limit",
+          "regulatory|priority--stop", "regulatory|priority--give_way|yield", "warning|mandatory--roundabout",
+          "prohibitory|regulatory--no-entry|no-traffic-both-ways",
+          "crossroads|junction", "mandatory--turn|straight", "uneven|slippery",
+          "no-parking", "no_overtaking",
+          "danger_pedestrian_crossing", "no_*_turn"};
   /**
    * The {@link JCheckBox} where the respective tag should be searched
@@ -82,10 +82,8 @@
   private final JCheckBox[] SIGN_CHECKBOXES = {this.signFilter.maxSpeed,
           this.signFilter.stop, this.signFilter.giveWay,
-          this.signFilter.roundabout, this.signFilter.access,
-          this.signFilter.access, this.signFilter.intersection,
-          this.signFilter.direction, this.signFilter.direction,
-          this.signFilter.intersection, this.signFilter.uneven,
+          this.signFilter.roundabout, this.signFilter.access, this.signFilter.intersection,
+          this.signFilter.direction, this.signFilter.uneven,
           this.signFilter.noParking, this.signFilter.noOvertaking,
-          this.signFilter.crossing, this.signFilter.noTurn, this.signFilter.noTurn};
+          this.signFilter.crossing, this.signFilter.noTurn};
 
   private MapillaryFilterDialog() {
@@ -242,9 +240,12 @@
   }
 
-  private static boolean checkSign(MapillaryImage img, JCheckBox signCheckBox, String singString) {
+  private static boolean checkSign(MapillaryImage img, JCheckBox signCheckBox, String signTag) {
     boolean contains = false;
-    for (String sign : img.getSigns()) {
-      if (sign.contains(singString))
+    for (MapillarySign sign : img.getSigns()) {
+      String[] parts = signTag.split("--");
+      if (Pattern.compile(parts[0]).matcher(sign.getCategory()).find() &&
+              Pattern.compile(parts[1]).matcher(sign.getType()).find()) {
         contains = true;
+      }
     }
     return contains == signCheckBox.isSelected() && contains;
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 32971)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillaryImageInfoDownloadThread.java	(revision 32972)
@@ -67,4 +67,5 @@
               ((MapillaryImage) image).setUser(data.getString("user"));
               ((MapillaryImage) image).setCapturedAt(data.getJsonNumber("captured_at").longValue());
+              ((MapillaryImage) image).setLocation(data.getString("location"));
             }
           }
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 32971)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillaryTrafficSignDownloadThread.java	(revision 32972)
@@ -17,4 +17,5 @@
 import org.openstreetmap.josm.plugins.mapillary.MapillaryImage;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
+import org.openstreetmap.josm.plugins.mapillary.MapillarySign;
 import org.openstreetmap.josm.plugins.mapillary.utils.MapillaryURL;
 import org.openstreetmap.josm.plugins.mapillary.utils.MapillaryURL.IMAGE_SELECTOR;
@@ -24,5 +25,4 @@
  *
  * @author nokutu
- *
  */
 public class MapillaryTrafficSignDownloadThread extends Thread {
@@ -34,7 +34,7 @@
    * Main constructor.
    *
-   * @param ex {@link ExecutorService} object that is executing this thread.
+   * @param ex     {@link ExecutorService} object that is executing this thread.
    * @param bounds the bounds in which the traffic signs should be downloaded
-   * @param page the pagenumber of the results page that should be retrieved
+   * @param page   the pagenumber of the results page that should be retrieved
    */
   public MapillaryTrafficSignDownloadThread(ExecutorService ex, Bounds bounds, int page) {
@@ -46,9 +46,8 @@
   @Override
   public void run() {
-
     try (
-      BufferedReader br = new BufferedReader(new InputStreamReader(
-        MapillaryURL.searchImageInfoURL(bounds, page, IMAGE_SELECTOR.OBJ_REC_ONLY).openStream(), "UTF-8"
-      ));
+            BufferedReader br = new BufferedReader(new InputStreamReader(
+                    MapillaryURL.searchImageInfoURL(bounds, page, IMAGE_SELECTOR.OBJ_REC_ONLY).openStream(), "UTF-8"
+            ));
     ) {
       JsonObject jsonobj = Json.createReader(br).readObject();
@@ -60,5 +59,5 @@
         JsonArray rects = jsonarr.getJsonObject(i).getJsonArray("rects");
         JsonArray rectversions = jsonarr.getJsonObject(i).getJsonArray(
-            "rectversions");
+                "rectversions");
         String key = jsonarr.getJsonObject(i).getString("key");
         if (rectversions != null) {
@@ -68,6 +67,7 @@
               JsonObject data = rects.getJsonObject(k);
               for (MapillaryAbstractImage image : MapillaryLayer.getInstance().getData().getImages()) {
-                if (image instanceof MapillaryImage && ((MapillaryImage) image).getKey().equals(key))
-                  ((MapillaryImage) image).addSign(data.getString("type"));
+                if (image instanceof MapillaryImage && ((MapillaryImage) image).getKey().equals(key)) {
+                  ((MapillaryImage) image).addSign(MapillarySign.getSign(data.getString("type"), rectversions.getJsonObject(j).getString("package").split("_")[1]));
+                }
               }
             }
@@ -81,5 +81,5 @@
             for (MapillaryAbstractImage image : MapillaryLayer.getInstance().getData().getImages()) {
               if (image instanceof MapillaryImage && ((MapillaryImage) image).getKey().equals(key)) {
-                ((MapillaryImage) image).addSign(data.getString("type"));
+                ((MapillaryImage) image).addSign(MapillarySign.getSign(data.getString("type"), data.getString("package").split("_")[1]));
               }
             }
@@ -87,6 +87,4 @@
         }
       }
-    } catch (MalformedURLException e) {
-      Main.error(e);
     } catch (IOException e) {
       Main.error(e);
