Index: /applications/editors/josm/plugins/mapillary/build.gradle
===================================================================
--- /applications/editors/josm/plugins/mapillary/build.gradle	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/build.gradle	(revision 31799)
@@ -105,5 +105,5 @@
   manifest {
     attributes("Plugin-Mainversion": project.property('plugin.main.version'),
-               "Plugin-Version": "31784",
+               "Plugin-Version": "31799",
                "Plugin-Class": project.property('plugin.class'),
                "Plugin-Description": project.property('plugin.description'),
Index: /applications/editors/josm/plugins/mapillary/gradle.properties
===================================================================
--- /applications/editors/josm/plugins/mapillary/gradle.properties	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/gradle.properties	(revision 31799)
@@ -7,5 +7,5 @@
 plugin.main.version=8433
 plugin.requires=apache-commons;apache-http
-plugin.version=1.0.4
-#plugin.early=…
-#plugin.stage=…
+plugin.version=1.1.0
+#plugin.early=...
+#plugin.stage=...
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryAbstractImage.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryAbstractImage.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryAbstractImage.java	(revision 31799)
@@ -5,4 +5,5 @@
 import java.util.Calendar;
 import java.util.Date;
+import java.util.Locale;
 
 import org.openstreetmap.josm.Main;
@@ -17,4 +18,8 @@
  */
 public abstract class MapillaryAbstractImage {
+  /**
+   * If two values for field ca differ by less than EPSILON both values are considered equal.
+   */
+  private static final float EPSILON = 1e-5f;
 
   /** The time the image was captured, in Epoch format. */
@@ -87,5 +92,5 @@
    */
   public String getDate() {
-    StringBuilder format = new StringBuilder("");
+    StringBuilder format = new StringBuilder(26);
     if (Main.pref.getBoolean("iso.dates"))
       format.append("yyyy-MM-dd");
@@ -108,9 +113,10 @@
    * @return A String containing the date the picture was taken using the given
    *         format.
+   * @throws NullPointerException if parameter format is <code>null</code>
    */
   public String getDate(String format) {
     Date date = new Date(getCapturedAt());
 
-    SimpleDateFormat formatter = new SimpleDateFormat(format);
+    SimpleDateFormat formatter = new SimpleDateFormat(format, Locale.UK);
     formatter.setTimeZone(Calendar.getInstance().getTimeZone());
     return formatter.format(date);
@@ -165,5 +171,5 @@
    */
   public boolean isModified() {
-    return (this.getLatLon() != this.latLon || this.getCa() != this.ca);
+    return !this.getLatLon().equals(this.latLon) || Math.abs(this.getCa() - this.ca) < EPSILON;
   }
 
@@ -197,5 +203,5 @@
    */
   public MapillaryAbstractImage next() {
-    synchronized (this.getClass()) {
+    synchronized (MapillaryAbstractImage.class) {
       if (this.getSequence() == null)
         return null;
@@ -211,5 +217,5 @@
    */
   public MapillaryAbstractImage previous() {
-    synchronized (this.getClass()) {
+    synchronized (MapillaryAbstractImage.class) {
       if (this.getSequence() == null)
         return null;
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryData.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryData.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryData.java	(revision 31799)
@@ -42,7 +42,7 @@
 
     // Adds the basic set of listeners.
-    addListener(MapillaryPlugin.walkAction);
-    addListener(MapillaryPlugin.zoomAction);
-    addListener(MapillaryPlugin.uploadAction);
+    addListener(MapillaryPlugin.getWalkAction());
+    addListener(MapillaryPlugin.getZoomAction());
+    addListener(MapillaryPlugin.getUploadAction());
     if (Main.main != null)
       addListener(MapillaryMainDialog.getInstance());
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryImportedImage.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryImportedImage.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryImportedImage.java	(revision 31799)
@@ -95,7 +95,7 @@
 
   @Override
-  public boolean equals(Object object) {
-    if (object instanceof MapillaryImportedImage)
-      return this.file.equals(((MapillaryImportedImage) object).file);
+  public boolean equals(Object other) {
+    if (other != null && other.getClass() == this.getClass())
+      return this.file.equals(((MapillaryImportedImage) other).file);
     return false;
   }
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java	(revision 31799)
@@ -18,6 +18,4 @@
 import java.awt.image.AffineTransformOp;
 import java.awt.image.BufferedImage;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
@@ -78,5 +76,5 @@
 
   /** If the download is in semiautomatic during this object lifetime. */
-  public boolean TEMP_SEMIAUTOMATIC = false;
+  public boolean tempSemiautomatic;
 
   /** Unique instance of the class. */
@@ -92,8 +90,6 @@
   public AbstractMode mode;
 
-  private int highlightPointRadius = Main.pref.getInteger(
-      "mappaint.highlight.radius", 7);
-  private int highlightStep = Main.pref
-      .getInteger("mappaint.highlight.step", 4);
+  private final int highlightPointRadius = Main.pref.getInteger("mappaint.highlight.radius", 7);
+  private final int highlightStep = Main.pref.getInteger("mappaint.highlight.step", 4);
 
   private volatile TexturePaint hatched;
@@ -123,6 +119,6 @@
     }
     // Does not execute when in headless mode
-    if (MapillaryPlugin.EXPORT_MENU != null) {
-      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.EXPORT_MENU, true);
+    if (MapillaryPlugin.getExportMenu() != null) {
+      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.getExportMenu(), true);
       if (!MapillaryMainDialog.getInstance().isShowing())
         MapillaryMainDialog.getInstance().getButton().doClick();
@@ -220,6 +216,6 @@
     MapillaryMainDialog.getInstance().setImage(null);
     MapillaryMainDialog.getInstance().updateImage();
-    MapillaryPlugin.setMenuEnabled(MapillaryPlugin.EXPORT_MENU, false);
-    MapillaryPlugin.setMenuEnabled(MapillaryPlugin.ZOOM_MENU, false);
+    MapillaryPlugin.setMenuEnabled(MapillaryPlugin.getExportMenu(), false);
+    MapillaryPlugin.setMenuEnabled(MapillaryPlugin.getZoomMenu(), false);
     Main.map.mapView.removeMouseListener(this.mode);
     Main.map.mapView.removeMouseMotionListener(this.mode);
@@ -464,9 +460,11 @@
   private MapillaryImage[] getClosestImagesFromDifferentSequences() {
     if (!(this.data.getSelectedImage() instanceof MapillaryImage))
-      return new MapillaryImage[2];
+      return new MapillaryImage[]{null, null};
     MapillaryImage selected = (MapillaryImage) this.data.getSelectedImage();
     MapillaryImage[] ret = new MapillaryImage[2];
-    double[] distances = { SEQUENCE_MAX_JUMP_DISTANCE,
-        SEQUENCE_MAX_JUMP_DISTANCE };
+    double[] distances = {
+        SEQUENCE_MAX_JUMP_DISTANCE,
+        SEQUENCE_MAX_JUMP_DISTANCE
+    };
     LatLon selectedCoords = this.data.getSelectedImage().getLatLon();
     for (MapillaryAbstractImage imagePrev : this.data.getImages()) {
@@ -501,17 +499,17 @@
   @Override
   public Object getInfoComponent() {
-    StringBuilder sb = new StringBuilder();
-    sb.append(tr("Mapillary layer"));
-    sb.append("\n");
-    sb.append(tr("Total images:"));
-    sb.append(" ");
-    sb.append(this.data.size());
-    sb.append("\n");
-    return sb.toString();
+    return new StringBuilder(35)
+      .append(tr("Mapillary layer"))
+      .append('\n')
+      .append(tr("Total images:"))
+      .append(' ')
+      .append(this.data.size())
+      .append('\n')
+      .toString();
   }
 
   @Override
   public String getToolTipText() {
-    return this.data.size() + " " + tr("images");
+    return this.data.size() + (' ' + tr("images"));
   }
 
@@ -568,7 +566,7 @@
     if (newLayer == this) {
       MapillaryUtils.updateHelpText();
-      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.JOIN_MENU, true);
+      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.getJoinMenu(), true);
     } else
-      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.JOIN_MENU, false);
+      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.getJoinMenu(), false);
   }
 
@@ -589,5 +587,5 @@
    *
    */
-  private class DelayedDownload extends Thread {
+  private static class DelayedDownload extends Thread {
 
     @Override
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryPlugin.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryPlugin.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryPlugin.java	(revision 31799)
@@ -41,4 +41,5 @@
  */
 public class MapillaryPlugin extends Plugin {
+  public static final String CLIENT_ID = "T1Fzd20xZjdtR0s1VDk5OFNIOXpYdzoxNDYyOGRkYzUyYTFiMzgz";
 
   /** OS route separator */
@@ -63,33 +64,33 @@
   private final MapillaryExportAction exportAction;
   /** Import action */
-  public static MapillaryImportAction importAction;
+  private final MapillaryImportAction importAction;
   /** Zoom action */
-  public static MapillaryZoomAction zoomAction;
+  private static MapillaryZoomAction zoomAction;
   private final MapillaryDownloadViewAction downloadViewAction;
   private final MapillaryImportIntoSequenceAction importIntoSequenceAction;
   private final MapillaryJoinAction joinAction;
   /** Walk action */
-  public static MapillaryWalkAction walkAction;
+  private static MapillaryWalkAction walkAction;
   /** Upload action */
-  public static MapillaryUploadAction uploadAction;
+  private static MapillaryUploadAction uploadAction;
 
   /** Menu button for the {@link MapillaryDownloadAction} action. */
-  public static JMenuItem DOWNLOAD_MENU;
+  private JMenuItem downloadMenu;
   /** Menu button for the {@link MapillaryExportAction} action. */
-  public static JMenuItem EXPORT_MENU;
+  private static JMenuItem exportMenu;
   /** Menu button for the {@link MapillaryImportAction} action. */
-  public static JMenuItem IMPORT_MENU;
+  private JMenuItem importMenu;
   /** Menu button for the {@link MapillaryZoomAction} action. */
-  public static JMenuItem ZOOM_MENU;
+  private static JMenuItem zoomMenu;
   /** Menu button for the {@link MapillaryDownloadViewAction} action. */
-  public static JMenuItem DOWNLOAD_VIEW_MENU;
+  private static JMenuItem downloadViewMenu;
   /** Menu button for the {@link MapillaryImportIntoSequenceAction} action. */
-  public static JMenuItem IMPORT_INTO_SEQUENCE_MENU;
+  private JMenuItem importIntoSequenceMenu;
   /** Menu button for the {@link MapillaryJoinAction} action. */
-  public static JMenuItem JOIN_MENU;
+  private static JMenuItem joinMenu;
   /** Menu button for the {@link MapillaryWalkAction} action. */
-  public static JMenuItem WALK_MENU;
+  private static JMenuItem walkMenu;
   /** Menu button for the {@link MapillaryUploadAction} action. */
-  public static JMenuItem UPLOAD_MENU;
+  private static JMenuItem uploadMenu;
 
   /**
@@ -102,44 +103,37 @@
     super(info);
 
-    this.downloadAction = new MapillaryDownloadAction();
+    downloadAction = new MapillaryDownloadAction();
     walkAction = new MapillaryWalkAction();
-    this.exportAction = new MapillaryExportAction();
+    exportAction = new MapillaryExportAction();
     importAction = new MapillaryImportAction();
     zoomAction = new MapillaryZoomAction();
-    this.downloadViewAction = new MapillaryDownloadViewAction();
-    this.importIntoSequenceAction = new MapillaryImportIntoSequenceAction();
-    this.joinAction = new MapillaryJoinAction();
+    downloadViewAction = new MapillaryDownloadViewAction();
+    importIntoSequenceAction = new MapillaryImportIntoSequenceAction();
+    joinAction = new MapillaryJoinAction();
     uploadAction = new MapillaryUploadAction();
 
     if (Main.main != null) { // important for headless mode
-      DOWNLOAD_MENU = MainMenu.add(Main.main.menu.imageryMenu,
-          this.downloadAction, false);
-      EXPORT_MENU = MainMenu.add(Main.main.menu.fileMenu, this.exportAction,
-          false, 14);
-      IMPORT_INTO_SEQUENCE_MENU = MainMenu.add(Main.main.menu.fileMenu,
-          this.importIntoSequenceAction, false, 14);
-      IMPORT_MENU = MainMenu.add(Main.main.menu.fileMenu, importAction, false,
-          14);
-      UPLOAD_MENU = MainMenu.add(Main.main.menu.fileMenu, uploadAction, false,
-          14);
-      ZOOM_MENU = MainMenu.add(Main.main.menu.viewMenu, zoomAction, false, 15);
-      DOWNLOAD_VIEW_MENU = MainMenu.add(Main.main.menu.fileMenu,
-          this.downloadViewAction, false, 14);
-      JOIN_MENU = MainMenu.add(Main.main.menu.dataMenu, this.joinAction, false);
-      WALK_MENU = MainMenu.add(Main.main.menu.moreToolsMenu, walkAction, false);
-
-      EXPORT_MENU.setEnabled(false);
-      DOWNLOAD_MENU.setEnabled(false);
-      IMPORT_MENU.setEnabled(false);
-      IMPORT_INTO_SEQUENCE_MENU.setEnabled(false);
-      ZOOM_MENU.setEnabled(false);
-      DOWNLOAD_VIEW_MENU.setEnabled(false);
-      JOIN_MENU.setEnabled(false);
-      WALK_MENU.setEnabled(false);
+      downloadMenu = MainMenu.add(Main.main.menu.imageryMenu, this.downloadAction, false);
+      exportMenu = MainMenu.add(Main.main.menu.fileMenu, exportAction, false, 14);
+      importIntoSequenceMenu = MainMenu.add(Main.main.menu.fileMenu, importIntoSequenceAction, false, 14);
+      importMenu = MainMenu.add(Main.main.menu.fileMenu, importAction, false, 14);
+      uploadMenu = MainMenu.add(Main.main.menu.fileMenu, uploadAction, false, 14);
+      zoomMenu = MainMenu.add(Main.main.menu.viewMenu, zoomAction, false, 15);
+      downloadViewMenu = MainMenu.add(Main.main.menu.fileMenu, this.downloadViewAction, false, 14);
+      joinMenu = MainMenu.add(Main.main.menu.dataMenu, this.joinAction, false);
+      walkMenu = MainMenu.add(Main.main.menu.moreToolsMenu, walkAction, false);
+
+      exportMenu.setEnabled(false);
+      downloadMenu.setEnabled(false);
+      importMenu.setEnabled(false);
+      importIntoSequenceMenu.setEnabled(false);
+      zoomMenu.setEnabled(false);
+      downloadViewMenu.setEnabled(false);
+      joinMenu.setEnabled(false);
+      walkMenu.setEnabled(false);
     }
 
     try {
-      CACHE = JCSCacheManager.getCache("mapillary", 10, 10000,
-          this.getPluginDir() + "/cache/");
+      CACHE = JCSCacheManager.getCache("mapillary", 10, 10000, this.getPluginDir() + "/cache/");
     } catch (IOException e) {
       Main.error(e);
@@ -148,4 +142,67 @@
     if (Main.pref.get("mapillary.access-token") == null)
       MapillaryUser.isTokenValid = false;
+  }
+
+  /**
+   * @return the menu-item associated with the {@link MapillaryDownloadViewAction}
+   */
+  public static JMenuItem getDownloadViewMenu() {
+    return downloadViewMenu;
+  }
+
+  /**
+   * @return the menu-item associated with the {@link MapillaryExportAction}
+   */
+  public static JMenuItem getExportMenu() {
+    return exportMenu;
+  }
+
+  /**
+   * @return the menu-item associated with the {@link MapillaryJoinAction}
+   */
+  public static JMenuItem getJoinMenu() {
+    return joinMenu;
+  }
+
+  /**
+   * @return the {@link MapillaryUploadAction} for the plugin
+   */
+  public static MapillaryDataListener getUploadAction() {
+    return uploadAction;
+  }
+
+  /**
+   * @return the menu-item associated with the {@link MapillaryUploadAction}
+   */
+  public static JMenuItem getUploadMenu() {
+    return uploadMenu;
+  }
+
+  /**
+   * @return the {@link MapillaryWalkAction} for the plugin
+   */
+  public static MapillaryWalkAction getWalkAction() {
+    return walkAction;
+  }
+
+  /**
+   * @return the menu-item associated with the {@link MapillaryWalkAction}
+   */
+  public static JMenuItem getWalkMenu() {
+    return walkMenu;
+  }
+
+  /**
+   * @return the {@link MapillaryZoomAction} for the plugin
+   */
+  public static MapillaryDataListener getZoomAction() {
+    return zoomAction;
+  }
+
+  /**
+   * @return the menu-item associated with the {@link MapillaryZoomAction}
+   */
+  public static JMenuItem getZoomMenu() {
+    return zoomMenu;
   }
 
@@ -159,9 +216,9 @@
       Main.map.addToggleDialog(MapillaryHistoryDialog.getInstance(), false);
       Main.map.addToggleDialog(MapillaryFilterDialog.getInstance(), false);
-      setMenuEnabled(DOWNLOAD_MENU, true);
+      setMenuEnabled(downloadMenu, true);
       if (MapillaryDownloader.getMode() == MapillaryDownloader.MODES.Manual)
-        setMenuEnabled(DOWNLOAD_VIEW_MENU, true);
-      setMenuEnabled(IMPORT_MENU, true);
-      setMenuEnabled(IMPORT_INTO_SEQUENCE_MENU, true);
+        setMenuEnabled(downloadViewMenu, true);
+      setMenuEnabled(importMenu, true);
+      setMenuEnabled(importIntoSequenceMenu, true);
     }
     if (oldFrame != null && newFrame == null) { // map frame destroyed
@@ -169,8 +226,8 @@
       MapillaryHistoryDialog.destroyInstance();
       MapillaryFilterDialog.destroyInstance();
-      setMenuEnabled(DOWNLOAD_MENU, false);
-      setMenuEnabled(DOWNLOAD_VIEW_MENU, false);
-      setMenuEnabled(IMPORT_MENU, false);
-      setMenuEnabled(IMPORT_INTO_SEQUENCE_MENU, false);
+      setMenuEnabled(downloadMenu, false);
+      setMenuEnabled(downloadViewMenu, false);
+      setMenuEnabled(importMenu, false);
+      setMenuEnabled(importIntoSequenceMenu, false);
     }
   }
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryTrafficSignLayer.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryTrafficSignLayer.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryTrafficSignLayer.java	(revision 31799)
@@ -3,4 +3,5 @@
 
 import java.awt.Color;
+import java.awt.Component;
 import java.awt.Font;
 import java.awt.FontFormatException;
@@ -13,4 +14,5 @@
 import javax.swing.Action;
 import javax.swing.Icon;
+import javax.swing.JLabel;
 
 import org.openstreetmap.josm.data.Bounds;
@@ -22,7 +24,21 @@
 import org.openstreetmap.josm.plugins.mapillary.traffico.TrafficoSign;
 import org.openstreetmap.josm.plugins.mapillary.traffico.TrafficoSignElement;
+import org.openstreetmap.josm.tools.I18n;
 
 public class MapillaryTrafficSignLayer extends AbstractModifiableLayer {
+  private static final String TRAFFICO_PATH = "data/fonts/traffico/traffico.ttf";
   private static MapillaryTrafficSignLayer instance;
+  private final Font traffico;
+
+  private MapillaryTrafficSignLayer() throws IOException {
+    super("Mapillary traffic signs");
+    try {
+      traffico = Font.createFont(Font.TRUETYPE_FONT, new File("data/fonts/traffico/traffico.ttf")).deriveFont(50.0f);
+    } catch (FontFormatException e) {
+      throw new IOException(I18n.tr("Traffic sign font at ''{0}'' has wrong format.", TRAFFICO_PATH), e);
+    } catch (IOException e) {
+      throw new IOException(I18n.tr("Could not read font-file from ''{{0}}''.", TRAFFICO_PATH), e);
+    }
+  }
 
   /**
@@ -30,15 +46,11 @@
    *
    * @return the only instance of the traffic sign layer
+   * @throws IOException if some error occured while reading the icon-font traffico or
+   *         if the traffico font has the wrong format
    */
-  public static MapillaryTrafficSignLayer getInstance() {
-    return instance == null ? (instance = new MapillaryTrafficSignLayer())
-        : instance;
-  }
-
-  /**
-   * @param name
-   */
-  private MapillaryTrafficSignLayer() {
-    super("Mapillary traffic signs");
+  public static MapillaryTrafficSignLayer getInstance() throws IOException {
+    if (instance == null)
+      instance = new MapillaryTrafficSignLayer();
+    return instance;
   }
 
@@ -61,14 +73,6 @@
   @Override
   public void paint(Graphics2D g, MapView mv, Bounds box) {
-    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
-        RenderingHints.VALUE_ANTIALIAS_ON);
-    try {
-      g.setFont(Font.createFont(Font.TRUETYPE_FONT,
-          new File("data/fonts/traffico/traffico.ttf")).deriveFont(50.0f));
-    } catch (FontFormatException e) {
-      e.printStackTrace();
-    } catch (IOException e) {
-      e.printStackTrace();
-    }
+    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+    g.setFont(traffico);
 
     Point[] points = new Point[3];
@@ -91,13 +95,10 @@
     // Start iterating the images
     g.setColor(Color.MAGENTA);
-    for (MapillaryAbstractImage img : MapillaryLayer.getInstance()
-        .getData().getImages()) {
+    for (MapillaryAbstractImage img : MapillaryLayer.getInstance().getData().getImages()) {
       if (img instanceof MapillaryImage) {
-        g.fillOval(mv.getPoint(img.getLatLon()).x - 3,
-            mv.getPoint(img.getLatLon()).y - 3, 6, 6);
+        g.fillOval(mv.getPoint(img.getLatLon()).x - 3, mv.getPoint(img.getLatLon()).y - 3, 6, 6);
         if (((MapillaryImage) img).getSigns().size() >= 1) {
           Point imgLoc = mv.getPoint(img.getLatLon());
-          for (TrafficoSignElement e : TrafficoSign.getSign("de",
-              ((MapillaryImage) img).getSigns().get(0))) {
+          for (TrafficoSignElement e : TrafficoSign.getSign("de", ((MapillaryImage) img).getSigns().get(0))) {
             g.setColor(e.getColor());
             g.drawString("" + e.getGlyph(), imgLoc.x, imgLoc.y);
@@ -137,6 +138,5 @@
   @Override
   public void mergeFrom(Layer from) {
-    // Does nothing as this layer is not mergeable (see method
-    // isMergable(Layer))
+    // Does nothing as this layer is not mergeable (see method isMergable(Layer))
   }
 
@@ -163,5 +163,4 @@
   public void visitBoundingBox(BoundingXYVisitor v) {
     // TODO Auto-generated method stub
-
   }
 
@@ -172,7 +171,6 @@
    */
   @Override
-  public Object getInfoComponent() {
-    // TODO Auto-generated method stub
-    return null;
+  public Component getInfoComponent() {
+    return new JLabel("Mapillary traffic sign layer");
   }
 
@@ -184,6 +182,5 @@
   @Override
   public Action[] getMenuEntries() {
-    // TODO Auto-generated method stub
-    return null;
+    return new Action[]{};
   }
 
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryUploadAction.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryUploadAction.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryUploadAction.java	(revision 31799)
@@ -71,7 +71,7 @@
       MapillaryAbstractImage newImage) {
     if (oldImage == null && newImage != null)
-      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.UPLOAD_MENU, true);
+      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.getUploadMenu(), true);
     else if (oldImage != null && newImage == null)
-      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.UPLOAD_MENU, false);
+      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.getUploadMenu(), false);
   }
 }
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryWalkAction.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryWalkAction.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryWalkAction.java	(revision 31799)
@@ -101,7 +101,7 @@
       MapillaryAbstractImage newImage) {
     if (newImage != null)
-      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.WALK_MENU, true);
+      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.getWalkMenu(), true);
     else
-      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.WALK_MENU, false);
+      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.getWalkMenu(), false);
   }
 
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryZoomAction.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryZoomAction.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryZoomAction.java	(revision 31799)
@@ -51,7 +51,7 @@
       MapillaryAbstractImage newImage) {
     if (oldImage == null && newImage != null)
-      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.ZOOM_MENU, true);
+      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.getZoomMenu(), true);
     else if (oldImage != null && newImage == null)
-      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.ZOOM_MENU, false);
+      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.getZoomMenu(), false);
   }
 
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/FinishedUploadDialog.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/FinishedUploadDialog.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/FinishedUploadDialog.java	(revision 31799)
@@ -7,5 +7,5 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.net.MalformedURLException;
+import java.io.IOException;
 import java.net.URL;
 
@@ -49,5 +49,5 @@
       try {
         MapillaryUtils.browse(new URL("http://www.mapillary.com/map/upload/im"));
-      } catch (MalformedURLException e1) {
+      } catch (IOException e1) {
         Main.error(e1);
       }
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/HyperlinkLabel.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/HyperlinkLabel.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/HyperlinkLabel.java	(revision 31799)
@@ -12,4 +12,5 @@
 import java.awt.event.ActionListener;
 import java.awt.event.MouseEvent;
+import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
@@ -161,7 +162,6 @@
       public void actionPerformed(ActionEvent arg0) {
         try {
-          MapillaryUtils.browse(new URL("http://www.mapillary.com/map/e/"
-              + HyperlinkLabel.this.key));
-        } catch (MalformedURLException e) {
+          MapillaryUtils.browse(new URL("http://www.mapillary.com/map/e/" + HyperlinkLabel.this.key));
+        } catch (IOException e) {
           Main.error(e);
         }
@@ -211,5 +211,9 @@
     if (this.url == null)
       return;
-    MapillaryUtils.browse(this.url);
+    try {
+      MapillaryUtils.browse(this.url);
+    } catch (IOException e1) {
+      Main.error(e1);
+    }
   }
 }
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryMainDialog.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryMainDialog.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryMainDialog.java	(revision 31799)
@@ -439,5 +439,5 @@
       putValue(SHORT_DESCRIPTION, tr("Stops the walk."));
       putValue(SMALL_ICON, ImageProvider.get("dialogs/mapillaryStop.png"));
-      MapillaryPlugin.walkAction.addListener(this);
+      MapillaryPlugin.getWalkAction().addListener(this);
     }
 
@@ -457,5 +457,5 @@
 
     private static final long serialVersionUID = -17943404752082788L;
-    private WalkThread thread;
+    private transient WalkThread thread;
 
     public PlayAction() {
@@ -463,5 +463,5 @@
       putValue(SHORT_DESCRIPTION, tr("Continues with the paused walk."));
       putValue(SMALL_ICON, ImageProvider.get("dialogs/mapillaryPlay.png"));
-      MapillaryPlugin.walkAction.addListener(this);
+      MapillaryPlugin.getWalkAction().addListener(this);
     }
 
@@ -489,5 +489,5 @@
       putValue(SHORT_DESCRIPTION, tr("Pauses the walk."));
       putValue(SMALL_ICON, ImageProvider.get("dialogs/mapillaryPause.png"));
-      MapillaryPlugin.walkAction.addListener(this);
+      MapillaryPlugin.getWalkAction().addListener(this);
     }
 
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryPreferenceSetting.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryPreferenceSetting.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryPreferenceSetting.java	(revision 31799)
@@ -6,5 +6,5 @@
 import java.awt.FlowLayout;
 import java.awt.event.ActionEvent;
-import java.net.MalformedURLException;
+import java.io.IOException;
 import java.net.URL;
 
@@ -99,5 +99,5 @@
         .put("mapillary.reverse-buttons", this.reverseButtons.isSelected());
 
-    MapillaryPlugin.setMenuEnabled(MapillaryPlugin.DOWNLOAD_VIEW_MENU, false);
+    MapillaryPlugin.setMenuEnabled(MapillaryPlugin.getDownloadViewMenu(), false);
     if (this.downloadMode.getSelectedItem().equals(MapillaryDownloader.MODES.Automatic.toString()))
       Main.pref.put("mapillary.download-mode", MapillaryDownloader.MODES.Automatic.toString());
@@ -106,5 +106,5 @@
     if (this.downloadMode.getSelectedItem().equals(MapillaryDownloader.MODES.Manual.toString())) {
       Main.pref.put("mapillary.download-mode", MapillaryDownloader.MODES.Manual.toString());
-      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.DOWNLOAD_VIEW_MENU, true);
+      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.getDownloadViewMenu(), true);
     }
     Main.pref.put("mapillary.display-hour", this.displayHour.isSelected());
@@ -133,8 +133,8 @@
       OAuthPortListener portListener = new OAuthPortListener();
       portListener.start();
-      String url = "http://www.mapillary.com/connect?redirect_uri=http:%2F%2Flocalhost:8763%2F&client_id=T1Fzd20xZjdtR0s1VDk5OFNIOXpYdzoxNDYyOGRkYzUyYTFiMzgz&response_type=token&scope=user:read%20public:upload%20public:write";
+      String url = "http://www.mapillary.com/connect?redirect_uri=http:%2F%2Flocalhost:8763%2F&client_id="+MapillaryPlugin.CLIENT_ID+"&response_type=token&scope=user:read%20public:upload%20public:write";
       try {
         MapillaryUtils.browse(new URL(url));
-      } catch (MalformedURLException e) {
+      } catch (IOException e) {
         Main.error(e);
       }
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillaryDownloader.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillaryDownloader.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillaryDownloader.java	(revision 31799)
@@ -40,6 +40,4 @@
   /** Base URL of the Mapillary API. */
   public static final String BASE_URL = "https://a.mapillary.com/v2/";
-  /** Client ID for the app */
-  public static final String CLIENT_ID = "T1Fzd20xZjdtR0s1VDk5OFNIOXpYdzoxNDYyOGRkYzUyYTFiMzgz";
   /** Executor that will run the petitions. */
   private static ThreadPoolExecutor EXECUTOR = new ThreadPoolExecutor(3, 5,
@@ -179,8 +177,8 @@
   public static MapillaryDownloader.MODES getMode() {
     if (Main.pref.get("mapillary.download-mode").equals(MODES.Automatic.toString())
-        && (!MapillaryLayer.hasInstance() || !MapillaryLayer.getInstance().TEMP_SEMIAUTOMATIC))
+        && (!MapillaryLayer.hasInstance() || !MapillaryLayer.getInstance().tempSemiautomatic))
       return MODES.Automatic;
     else if (Main.pref.get("mapillary.download-mode").equals(MODES.Semiautomatic.toString())
-        || (MapillaryLayer.hasInstance() && MapillaryLayer.getInstance().TEMP_SEMIAUTOMATIC))
+        || (MapillaryLayer.hasInstance() && MapillaryLayer.getInstance().tempSemiautomatic))
       return MODES.Semiautomatic;
     else if (Main.pref.get("mapillary.download-mode").equals(MODES.Manual.toString()))
@@ -201,6 +199,6 @@
       });
     } else {
-      MapillaryLayer.getInstance().TEMP_SEMIAUTOMATIC = true;
-      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.DOWNLOAD_VIEW_MENU, true);
+      MapillaryLayer.getInstance().tempSemiautomatic = true;
+      MapillaryPlugin.setMenuEnabled(MapillaryPlugin.getDownloadViewMenu(), true);
       JOptionPane
           .showMessageDialog(
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillarySquareDownloadManagerThread.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillarySquareDownloadManagerThread.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/io/download/MapillarySquareDownloadManagerThread.java	(revision 31799)
@@ -5,6 +5,7 @@
 import java.net.URLEncoder;
 import java.util.Locale;
+import java.util.Map.Entry;
 import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
@@ -12,4 +13,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryData;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryPlugin;
 import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryFilterDialog;
 import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryMainDialog;
@@ -49,6 +51,5 @@
    *
    */
-  public MapillarySquareDownloadManagerThread(
-      ConcurrentHashMap<String, Double> queryStringParts) {
+  public MapillarySquareDownloadManagerThread(ConcurrentMap<String, Double> queryStringParts) {
     this.imageQueryString = buildQueryString(queryStringParts);
     this.sequenceQueryString = buildQueryString(queryStringParts);
@@ -60,14 +61,13 @@
 
   // TODO: Maybe move into a separate utility class?
-  private static String buildQueryString(ConcurrentHashMap<String, Double> hash) {
-    StringBuilder ret = new StringBuilder("?client_id="
-        + MapillaryDownloader.CLIENT_ID);
-    for (String key : hash.keySet())
-      if (key != null)
+  private static String buildQueryString(ConcurrentMap<String, Double> hash) {
+    StringBuilder ret = new StringBuilder().append("?client_id=").append(MapillaryPlugin.CLIENT_ID);
+    for (Entry<String, Double> entry : hash.entrySet())
+      if (entry.getKey() != null)
         try {
-          ret.append("&" + URLEncoder.encode(key, "UTF-8")).append(
-              "="
-                  + URLEncoder.encode(
-                      String.format(Locale.UK, "%f", hash.get(key)), "UTF-8"));
+          ret.append('&')
+            .append(URLEncoder.encode(entry.getKey(), "UTF-8"))
+            .append('=')
+            .append(URLEncoder.encode(String.format(Locale.UK, "%f", entry.getValue()), "UTF-8"));
         } catch (UnsupportedEncodingException e) {
           // This should not happen, as the encoding is hard-coded
@@ -106,6 +106,5 @@
     while (!this.downloadExecutor.isShutdown()) {
       this.downloadExecutor.execute(new MapillarySequenceDownloadThread(
-          this.downloadExecutor, this.sequenceQueryString + "&page=" + page
-              + "&limit=10"));
+          this.downloadExecutor, this.sequenceQueryString + "&page=" + page + "&limit=10"));
       while (this.downloadExecutor.getQueue().remainingCapacity() == 0)
         Thread.sleep(500);
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/oauth/MapillaryUser.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/oauth/MapillaryUser.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/oauth/MapillaryUser.java	(revision 31799)
@@ -5,6 +5,8 @@
 import java.net.URL;
 import java.util.HashMap;
+import java.util.Map;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryPlugin;
 
 /**
@@ -17,6 +19,6 @@
 
   private static String username;
-  private static String images_policy;
-  private static String images_hash;
+  private static String imagesPolicy;
+  private static String imagesHash;
   /** If the stored token is valid or not. */
   public static boolean isTokenValid = true;
@@ -35,5 +37,5 @@
             .getWithHeader(
                 new URL(
-                    "https://a.mapillary.com/v2/me?client_id=T1Fzd20xZjdtR0s1VDk5OFNIOXpYdzoxNDYyOGRkYzUyYTFiMzgz"))
+                    "https://a.mapillary.com/v2/me?client_id="+MapillaryPlugin.CLIENT_ID))
             .getString("username");
       } catch (IOException e) {
@@ -48,21 +50,21 @@
    *         strings.
    */
-  public static HashMap<String, String> getSecrets() {
+  public static Map<String, String> getSecrets() {
     if (!isTokenValid)
       return null;
-    HashMap<String, String> hash = new HashMap<>();
+    Map<String, String> hash = new HashMap<>();
     try {
-      if (images_hash == null)
-        images_hash = OAuthUtils
+      if (imagesHash == null)
+        imagesHash = OAuthUtils
             .getWithHeader(
                 new URL(
-                    "https://a.mapillary.com/v2/me/uploads/secrets?client_id=T1Fzd20xZjdtR0s1VDk5OFNIOXpYdzoxNDYyOGRkYzUyYTFiMzgz"))
+                    "https://a.mapillary.com/v2/me/uploads/secrets?client_id="+MapillaryPlugin.CLIENT_ID))
             .getString("images_hash");
-      hash.put("images_hash", images_hash);
-      if (images_policy == null)
-        images_policy = OAuthUtils
+      hash.put("images_hash", imagesHash);
+      if (imagesPolicy == null)
+        imagesPolicy = OAuthUtils
             .getWithHeader(
                 new URL(
-                    "https://a.mapillary.com/v2/me/uploads/secrets?client_id=T1Fzd20xZjdtR0s1VDk5OFNIOXpYdzoxNDYyOGRkYzUyYTFiMzgz"))
+                    "https://a.mapillary.com/v2/me/uploads/secrets?client_id="+MapillaryPlugin.CLIENT_ID))
             .getString("images_policy");
     } catch (IOException e) {
@@ -70,5 +72,5 @@
       reset();
     }
-    hash.put("images_policy", images_policy);
+    hash.put("images_policy", imagesPolicy);
     return hash;
   }
@@ -79,6 +81,6 @@
   public static void reset() {
     username = null;
-    images_policy = null;
-    images_hash = null;
+    imagesPolicy = null;
+    imagesHash = null;
     isTokenValid = false;
     Main.pref.put("mapillary.access-token", null);
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/traffico/TrafficoSign.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/traffico/TrafficoSign.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/traffico/TrafficoSign.java	(revision 31799)
@@ -15,9 +15,9 @@
 
 public final class TrafficoSign {
+  private static Map<String, Map<String, TrafficoSignElement[]>> signs = new HashMap<>();
+
   private TrafficoSign() {
     // private constructor to avoid instantiation
   }
-
-  private static Map<String, Map<String, TrafficoSignElement[]>> signs = new HashMap<>();
 
   public static TrafficoSignElement[] getSign(String country, String signName) {
Index: /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/utils/MapillaryUtils.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/utils/MapillaryUtils.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/utils/MapillaryUtils.java	(revision 31799)
@@ -41,29 +41,32 @@
  *
  */
-public class MapillaryUtils {
-
-  private static double MIN_ZOOM_SQUARE_SIDE = 0.002;
+public final class MapillaryUtils {
+
+  private static final double MIN_ZOOM_SQUARE_SIDE = 0.002;
+
+  private MapillaryUtils() {
+    // Private constructor to avoid instantiation
+  }
 
   /**
    * Open the default browser in the given URL.
    *
-   * @param url
-   *          The URL that is going to be opened.
-   */
-  public static void browse(URL url) {
+   * @param url The (not-null) URL that is going to be opened.
+   * @throws IOException when the URL could not be opened
+   */
+  public static void browse(URL url) throws IOException {
+    if (url == null) {
+      throw new IllegalArgumentException();
+    }
     Desktop desktop = Desktop.getDesktop();
     if (desktop.isSupported(Desktop.Action.BROWSE)) {
       try {
         desktop.browse(url.toURI());
-      } catch (IOException | URISyntaxException e1) {
-        Main.error(e1);
+      } catch (URISyntaxException e1) {
+        throw new IOException(e1);
       }
     } else {
       Runtime runtime = Runtime.getRuntime();
-      try {
-        runtime.exec("xdg-open " + url);
-      } catch (IOException exc) {
-        exc.printStackTrace();
-      }
+      runtime.exec("xdg-open " + url);
     }
   }
Index: /applications/editors/josm/plugins/mapillary/test/unit/org/openstreetmap/josm/plugins/mapillary/MapillaryTrafficSignLayerTest.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/test/unit/org/openstreetmap/josm/plugins/mapillary/MapillaryTrafficSignLayerTest.java	(revision 31799)
+++ /applications/editors/josm/plugins/mapillary/test/unit/org/openstreetmap/josm/plugins/mapillary/MapillaryTrafficSignLayerTest.java	(revision 31799)
@@ -0,0 +1,26 @@
+package org.openstreetmap.josm.plugins.mapillary;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
+
+import java.io.IOException;
+
+import org.junit.Test;
+import org.openstreetmap.josm.data.imagery.ImageryInfo;
+import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.gui.layer.Layer;
+
+public class MapillaryTrafficSignLayerTest extends AbstractTest {
+  private Layer dummyLayer = ImageryLayer.create(new ImageryInfo());
+
+  @Test
+  public void test() throws IOException {
+    assertFalse(MapillaryTrafficSignLayer.getInstance().isModified());
+    assertFalse(MapillaryTrafficSignLayer.getInstance().isMergable(dummyLayer));
+    assertFalse(MapillaryTrafficSignLayer.getInstance().isMergable(MapillaryTrafficSignLayer.getInstance()));
+    assertEquals(MapillaryPlugin.ICON16, MapillaryTrafficSignLayer.getInstance().getIcon());
+    assertEquals(null, MapillaryTrafficSignLayer.getInstance().getToolTipText());
+    assertNotEquals(null, MapillaryTrafficSignLayer.getInstance().getInfoComponent());
+  }
+}
Index: /applications/editors/josm/plugins/mapillary/test/unit/org/openstreetmap/josm/plugins/mapillary/io/download/MapillarySequenceDownloadThreadTest.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/test/unit/org/openstreetmap/josm/plugins/mapillary/io/download/MapillarySequenceDownloadThreadTest.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/test/unit/org/openstreetmap/josm/plugins/mapillary/io/download/MapillarySequenceDownloadThreadTest.java	(revision 31799)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.plugins.mapillary.AbstractTest;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryPlugin;
 import org.openstreetmap.josm.plugins.mapillary.io.download.MapillaryDownloader;
 import org.openstreetmap.josm.plugins.mapillary.io.download.MapillarySequenceDownloadThread;
@@ -47,5 +48,5 @@
             "?max_lat=%.8f&max_lon=%.8f&min_lat=%.8f&min_lon=%.8f&limit=10&client_id=%s",
             maxLatLon.lat(), maxLatLon.lon(), minLatLon.lat(), minLatLon.lon(),
-            MapillaryDownloader.CLIENT_ID);
+            MapillaryPlugin.CLIENT_ID);
     MapillaryLayer.getInstance().getData().bounds.add(new Bounds(minLatLon,
         maxLatLon));
Index: /applications/editors/josm/plugins/mapillary/test/unit/org/openstreetmap/josm/plugins/mapillary/utils/MapillaryUtilsTest.java
===================================================================
--- /applications/editors/josm/plugins/mapillary/test/unit/org/openstreetmap/josm/plugins/mapillary/utils/MapillaryUtilsTest.java	(revision 31798)
+++ /applications/editors/josm/plugins/mapillary/test/unit/org/openstreetmap/josm/plugins/mapillary/utils/MapillaryUtilsTest.java	(revision 31799)
@@ -15,4 +15,9 @@
  */
 public class MapillaryUtilsTest {
+
+  @Test
+  public void testUtilityClass() {
+    TestUtil.testUtilityClass(MapillaryUtils.class);
+  }
 
   /**
