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 31318)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryImportedImage.java	(revision 31319)
@@ -25,5 +25,5 @@
         super(lat, lon, ca);
         this.file = file;
-        this.datetimeOriginal = getEpoch(datetimeOriginal, "yyyy/MM/dd hh:mm:ss");
+        this.datetimeOriginal = getEpoch(datetimeOriginal, "yyyy:MM:dd hh:mm:ss");
     }
 
@@ -57,5 +57,5 @@
         Calendar cal = Calendar.getInstance();
 
-        SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss");
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy:MM:dd hh:mm:ss");
         return formatter.format(cal.getTime());
 
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 31318)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java	(revision 31319)
@@ -69,5 +69,5 @@
 	public static MapillaryImage RED;
 
-	private final MapillaryData data = MapillaryData.getInstance();
+	public final MapillaryData data = MapillaryData.getInstance();
 
 	public ArrayList<Bounds> bounds;
@@ -105,9 +105,10 @@
 			MapView.addEditLayerChangeListener(this, false);
 			MapView.addLayerChangeListener(this);
-			Main.map.mapView.getEditLayer().data.addDataSetListener(this);
+			if (Main.map.mapView.getEditLayer() != null)
+				Main.map.mapView.getEditLayer().data.addDataSetListener(this);
 		}
 		MapillaryPlugin.setMenuEnabled(MapillaryPlugin.EXPORT_MENU, true);
 		if (!MapillaryToggleDialog.getInstance().isShowing())
-		    MapillaryToggleDialog.getInstance().getButton().doClick();
+			MapillaryToggleDialog.getInstance().getButton().doClick();
 		createHatchTexture();
 		data.dataUpdated();
@@ -500,4 +501,10 @@
 	@Override
 	public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+		if (oldLayer == null && newLayer != null) {
+			newLayer.data.addDataSetListener(this);
+
+		} else if (oldLayer != null && newLayer == null) {
+			oldLayer.data.removeDataSetListener(this);
+		}
 	}
 
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 31318)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryPlugin.java	(revision 31319)
@@ -33,106 +33,106 @@
 public class MapillaryPlugin extends Plugin implements EditLayerChangeListener {
 
-    public static final ImageIcon ICON24 = new ImageProvider("icon24.png")
-            .get();
-    public static final ImageIcon ICON16 = new ImageProvider("icon16.png")
-            .get();
-    public static final ImageIcon MAP_ICON = new ImageProvider("mapicon.png")
-            .get();
-    public static final ImageIcon MAP_ICON_SELECTED = new ImageProvider(
-            "mapiconselected.png").get();
-    public static final ImageIcon MAP_ICON_IMPORTED = new ImageProvider(
-            "mapiconimported.png").get();
-    public static final ImageIcon MAP_SIGN = new ImageProvider("sign.png")
-            .get();
-    public static final int ICON_SIZE = 24;
+	public static final ImageIcon ICON24 = new ImageProvider("icon24.png")
+			.get();
+	public static final ImageIcon ICON16 = new ImageProvider("icon16.png")
+			.get();
+	public static final ImageIcon MAP_ICON = new ImageProvider("mapicon.png")
+			.get();
+	public static final ImageIcon MAP_ICON_SELECTED = new ImageProvider(
+			"mapiconselected.png").get();
+	public static final ImageIcon MAP_ICON_IMPORTED = new ImageProvider(
+			"mapiconimported.png").get();
+	public static final ImageIcon MAP_SIGN = new ImageProvider("sign.png")
+			.get();
+	public static final int ICON_SIZE = 24;
 
-    public static CacheAccess<String, BufferedImageCacheEntry> CACHE;
+	public static CacheAccess<String, BufferedImageCacheEntry> CACHE;
 
-    private final MapillaryDownloadAction downloadAction;
-    private final MapillaryExportAction exportAction;
-    private final MapillaryImportAction importAction;
-    private final MapillaryZoomAction zoomAction;
-    private final MapillaryDownloadViewAction downloadViewAction;
+	private final MapillaryDownloadAction downloadAction;
+	private final MapillaryExportAction exportAction;
+	private final MapillaryImportAction importAction;
+	private final MapillaryZoomAction zoomAction;
+	private final MapillaryDownloadViewAction downloadViewAction;
 
-    public static JMenuItem DOWNLOAD_MENU;
-    public static JMenuItem EXPORT_MENU;
-    public static JMenuItem IMPORT_MENU;
-    public static JMenuItem ZOOM_MENU;
-    public static JMenuItem DOWNLOAD_VIEW_MENU;
+	public static JMenuItem DOWNLOAD_MENU;
+	public static JMenuItem EXPORT_MENU;
+	public static JMenuItem IMPORT_MENU;
+	public static JMenuItem ZOOM_MENU;
+	public static JMenuItem DOWNLOAD_VIEW_MENU;
 
-    public MapillaryPlugin(PluginInformation info) {
-        super(info);
-        downloadAction = new MapillaryDownloadAction();
-        exportAction = new MapillaryExportAction();
-        importAction = new MapillaryImportAction();
-        zoomAction = new MapillaryZoomAction();
-        downloadViewAction = new MapillaryDownloadViewAction();
+	public MapillaryPlugin(PluginInformation info) {
+		super(info);
+		downloadAction = new MapillaryDownloadAction();
+		exportAction = new MapillaryExportAction();
+		importAction = new MapillaryImportAction();
+		zoomAction = new MapillaryZoomAction();
+		downloadViewAction = new MapillaryDownloadViewAction();
 
-        DOWNLOAD_MENU = MainMenu.add(Main.main.menu.imageryMenu,
-                downloadAction, false);
-        EXPORT_MENU = MainMenu.add(Main.main.menu.fileMenu, exportAction,
-                false, 14);
-        IMPORT_MENU = MainMenu.add(Main.main.menu.fileMenu, importAction,
-                false, 14);
-        ZOOM_MENU = MainMenu
-                .add(Main.main.menu.viewMenu, zoomAction, false, 15);
-        DOWNLOAD_VIEW_MENU = MainMenu.add(Main.main.menu.fileMenu,
-                downloadViewAction, false, 14);
+		DOWNLOAD_MENU = MainMenu.add(Main.main.menu.imageryMenu,
+				downloadAction, false);
+		EXPORT_MENU = MainMenu.add(Main.main.menu.fileMenu, exportAction,
+				false, 14);
+		IMPORT_MENU = MainMenu.add(Main.main.menu.fileMenu, importAction,
+				false, 14);
+		ZOOM_MENU = MainMenu
+				.add(Main.main.menu.viewMenu, zoomAction, false, 15);
+		DOWNLOAD_VIEW_MENU = MainMenu.add(Main.main.menu.fileMenu,
+				downloadViewAction, false, 14);
 
-        EXPORT_MENU.setEnabled(false);
-        DOWNLOAD_MENU.setEnabled(false);
-        IMPORT_MENU.setEnabled(false);
-        ZOOM_MENU.setEnabled(false);
-        DOWNLOAD_VIEW_MENU.setEnabled(false);
+		EXPORT_MENU.setEnabled(false);
+		DOWNLOAD_MENU.setEnabled(false);
+		IMPORT_MENU.setEnabled(false);
+		ZOOM_MENU.setEnabled(false);
+		DOWNLOAD_VIEW_MENU.setEnabled(false);
 
-        MapView.addEditLayerChangeListener(this);
-        try {
-            CACHE = JCSCacheManager.getCache("mapillary", 10, 10000,
-                    this.getPluginDir() + "/cache/");
-        } catch (IOException e) {
-            Main.error(e);
-        }
-    }
+		MapView.addEditLayerChangeListener(this);
+		try {
+			CACHE = JCSCacheManager.getCache("mapillary", 10, 10000,
+					this.getPluginDir() + "/cache/");
+		} catch (IOException e) {
+			Main.error(e);
+		}
+	}
 
-    /**
-     * Called when the JOSM map frame is created or destroyed.
-     */
-    @Override
-    public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
-        if (oldFrame == null && newFrame != null) { // map frame added
-            Main.map.addToggleDialog(MapillaryToggleDialog.getInstance(), false);
-            Main.map.addToggleDialog(MapillaryHistoryDialog.getInstance(),
-                    false);
-            Main.map.addToggleDialog(MapillaryFilterDialog.getInstance(), false);
-        }
-        if (oldFrame != null && newFrame == null) { // map frame destroyed
-            MapillaryToggleDialog.destroyInstance();
-            MapillaryHistoryDialog.destroyInstance();
-            MapillaryFilterDialog.destroyInstance();
-        }
-    }
+	/**
+	 * Called when the JOSM map frame is created or destroyed.
+	 */
+	@Override
+	public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
+		if (oldFrame == null && newFrame != null) { // map frame added
+			Main.map.addToggleDialog(MapillaryToggleDialog.getInstance(), false);
+			Main.map.addToggleDialog(MapillaryHistoryDialog.getInstance(),
+					false);
+			Main.map.addToggleDialog(MapillaryFilterDialog.getInstance(), false);
+			setMenuEnabled(DOWNLOAD_MENU, true);
+			if (Main.pref.getBoolean("mapillary.download-manually"))
+				setMenuEnabled(DOWNLOAD_VIEW_MENU, true);
+			setMenuEnabled(IMPORT_MENU, true);
+		}
+		if (oldFrame != null && newFrame == null) { // map frame destroyed
+			MapillaryToggleDialog.destroyInstance();
+			MapillaryHistoryDialog.destroyInstance();
+			MapillaryFilterDialog.destroyInstance();
+			setMenuEnabled(DOWNLOAD_MENU, false);
+			setMenuEnabled(DOWNLOAD_VIEW_MENU, false);
+			setMenuEnabled(IMPORT_MENU, false);
+		}
+	}
 
-    public static void setMenuEnabled(JMenuItem menu, boolean value) {
-        menu.setEnabled(value);
-        menu.getAction().setEnabled(value);
-    }
+	public static void setMenuEnabled(JMenuItem menu, boolean value) {
+		menu.setEnabled(value);
+		menu.getAction().setEnabled(value);
+	}
 
-    @Override
-    public PreferenceSetting getPreferenceSetting() {
-        return new MapillaryPreferenceSetting();
-    }
+	@Override
+	public PreferenceSetting getPreferenceSetting() {
+		return new MapillaryPreferenceSetting();
+	}
 
-    @Override
-    public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
-        if (oldLayer == null && newLayer != null) {
-            setMenuEnabled(DOWNLOAD_MENU, true);
-            setMenuEnabled(IMPORT_MENU, true);
-            if (Main.pref.getBoolean("mapillary.download-manually"))
-                setMenuEnabled(DOWNLOAD_VIEW_MENU, true);
-        } else if (oldLayer != null && newLayer == null) {
-            setMenuEnabled(DOWNLOAD_MENU, false);
-            setMenuEnabled(IMPORT_MENU, false);
-            setMenuEnabled(DOWNLOAD_VIEW_MENU, false);
-        }
-    }
+	@Override
+	public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
+		if (oldLayer == null && newLayer != null) {
+		} else if (oldLayer != null && newLayer == null) {
+		}
+	}
 }
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryDownloadAction.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryDownloadAction.java	(revision 31318)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryDownloadAction.java	(revision 31319)
@@ -23,25 +23,26 @@
 public class MapillaryDownloadAction extends JosmAction {
 
-    public MapillaryDownloadAction() {
-        super(tr("Mapillary"), new ImageProvider("icon24.png"),
-                tr("Create Mapillary layer"), Shortcut.registerShortcut(
-                        "Mapillary", tr("Start Mapillary layer"),
-                        KeyEvent.VK_COMMA, Shortcut.SHIFT), false,
-                "mapillaryDownload", false);
-        this.setEnabled(false);
-    }
+	public MapillaryDownloadAction() {
+		super(tr("Mapillary"), new ImageProvider("icon24.png"),
+				tr("Create Mapillary layer"), Shortcut.registerShortcut(
+						"Mapillary", tr("Start Mapillary layer"),
+						KeyEvent.VK_COMMA, Shortcut.SHIFT), false,
+				"mapillaryDownload", false);
+		this.setEnabled(false);
+	}
 
-    @Override
-    public void actionPerformed(ActionEvent arg0) {
-        if (MapillaryLayer.INSTANCE == null)
-            MapillaryLayer.getInstance().download();
-        else {
-            if (Main.map.mapView.getActiveLayer() != MapillaryLayer
-                    .getInstance())
-                Main.map.mapView.setActiveLayer(MapillaryLayer.getInstance());
-            else
-                Main.map.mapView
-                        .setActiveLayer(Main.map.mapView.getEditLayer());
-        }
-    }
+	@Override
+	public void actionPerformed(ActionEvent arg0) {
+		if (MapillaryLayer.INSTANCE == null) {
+			if (Main.map.mapView.getEditLayer() != null)
+				MapillaryLayer.getInstance().download();
+		} else {
+			if (Main.map.mapView.getActiveLayer() != MapillaryLayer
+					.getInstance())
+				Main.map.mapView.setActiveLayer(MapillaryLayer.getInstance());
+			else
+				Main.map.mapView
+						.setActiveLayer(Main.map.mapView.getEditLayer());
+		}
+	}
 }
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryImportAction.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryImportAction.java	(revision 31318)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/actions/MapillaryImportAction.java	(revision 31319)
@@ -120,4 +120,5 @@
                     || lon_ref == null) {
                 readNoTags(file);
+                return;
             }
             double latValue = 0;
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryDownloader.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryDownloader.java	(revision 31318)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryDownloader.java	(revision 31319)
@@ -4,4 +4,5 @@
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
 
 import java.util.concurrent.ConcurrentHashMap;
@@ -52,5 +53,5 @@
             Main.info("GET " + url2 + " (Mapillary plugin)");
             Main.worker.submit(new MapillarySquareDownloadManagerThread(url1,
-                    url2, url3));
+                    url2, url3, MapillaryLayer.getInstance()));
         } catch (Exception e) {
             Main.error(e);
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryImageInfoDownloaderThread.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryImageInfoDownloaderThread.java	(revision 31318)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillaryImageInfoDownloaderThread.java	(revision 31319)
@@ -15,6 +15,6 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
-import org.openstreetmap.josm.plugins.mapillary.MapillaryData;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryImage;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
 
 /**
@@ -25,41 +25,44 @@
  */
 public class MapillaryImageInfoDownloaderThread implements Runnable {
-    private final String url;
-    private final ExecutorService ex;
+	private final String url;
+	private final ExecutorService ex;
+	private final MapillaryLayer layer;
 
-    public MapillaryImageInfoDownloaderThread(ExecutorService ex, String url) {
-        this.ex = ex;
-        this.url = url;
-    }
+	public MapillaryImageInfoDownloaderThread(ExecutorService ex, String url,
+			MapillaryLayer layer) {
+		this.ex = ex;
+		this.url = url;
+		this.layer = layer;
+	}
 
-    public void run() {
-        try {
-            BufferedReader br = new BufferedReader(new InputStreamReader(
-                    new URL(url).openStream()));
-            JsonObject jsonobj = Json.createReader(br).readObject();
-            if (!jsonobj.getBoolean("more"))
-                ex.shutdown();
-            JsonArray jsonarr = jsonobj.getJsonArray("ims");
-            JsonObject data;
-            for (int i = 0; i < jsonarr.size(); i++) {
-                data = jsonarr.getJsonObject(i);
-                String key = data.getString("key");
-                for (MapillaryAbstractImage image : MapillaryData.getInstance()
-                        .getImages()) {
-                    if (image instanceof MapillaryImage) {
-                        if (((MapillaryImage) image).getKey().equals(key)) {
-                            ((MapillaryImage) image).setUser(data
-                                    .getString("user"));
-                            ((MapillaryImage) image).setCapturedAt(data
-                                    .getJsonNumber("captured_at").longValue());
-                        }
-                    }
-                }
-            }
-        } catch (MalformedURLException e) {
-            Main.error(e);
-        } catch (IOException e) {
-            Main.error(e);
-        }
-    }
+	public void run() {
+		try {
+			BufferedReader br = new BufferedReader(new InputStreamReader(
+					new URL(url).openStream()));
+			JsonObject jsonobj = Json.createReader(br).readObject();
+			if (!jsonobj.getBoolean("more"))
+				ex.shutdown();
+			JsonArray jsonarr = jsonobj.getJsonArray("ims");
+			JsonObject data;
+			for (int i = 0; i < jsonarr.size(); i++) {
+				data = jsonarr.getJsonObject(i);
+				String key = data.getString("key");
+				for (MapillaryAbstractImage image : layer.data.getImages()) {
+					if (image instanceof MapillaryImage) {
+						if (((MapillaryImage) image).getKey().equals(key)
+								&& ((MapillaryImage) image).getUser() == null) {
+							((MapillaryImage) image).setUser(data
+									.getString("user"));
+							((MapillaryImage) image).setCapturedAt(data
+									.getJsonNumber("captured_at").longValue());
+						}
+					}
+				}
+			}
+		} catch (MalformedURLException e) {
+			Main.error(e);
+		} catch (IOException e) {
+			Main.error(e);
+		}
+	}
 }
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySequenceDownloadThread.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySequenceDownloadThread.java	(revision 31318)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySequenceDownloadThread.java	(revision 31319)
@@ -17,5 +17,4 @@
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
-import org.openstreetmap.josm.plugins.mapillary.MapillaryData;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryImage;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
@@ -32,81 +31,90 @@
 public class MapillarySequenceDownloadThread implements Runnable {
 
-    private String url;
-    private ExecutorService ex;
-    private List<Bounds> bounds;
+	private final String url;
+	private final ExecutorService ex;
+	private final List<Bounds> bounds;
+	private final MapillaryLayer layer;
+	private final MapillarySquareDownloadManagerThread manager;
 
-    public MapillarySequenceDownloadThread(ExecutorService ex, String url) {
-        this.url = url;
-        this.ex = ex;
-        this.bounds = MapillaryLayer.getInstance().bounds;
-    }
+	public MapillarySequenceDownloadThread(ExecutorService ex, String url,
+			MapillaryLayer layer, MapillarySquareDownloadManagerThread manager) {
+		this.url = url;
+		this.ex = ex;
+		this.bounds = layer.bounds;
+		this.layer = layer;
+		this.manager = manager;
+	}
 
-    public void run() {
-        try {
-            BufferedReader br;
-            br = new BufferedReader(new InputStreamReader(
-                    new URL(url).openStream()));
-            JsonObject jsonall = Json.createReader(br).readObject();
+	public void run() {
+		try {
+			BufferedReader br;
+			br = new BufferedReader(new InputStreamReader(
+					new URL(url).openStream()));
+			JsonObject jsonall = Json.createReader(br).readObject();
 
-            if (!jsonall.getBoolean("more") && !ex.isShutdown())
-                ex.shutdown();
-            JsonArray jsonseq = jsonall.getJsonArray("ss");
-            // At the moment there is a bug with some sequences at Mapillay API,
-            // so if they are wrong he use this variable to skip them.
-            boolean isSequenceWrong = false;
-            for (int i = 0; i < jsonseq.size(); i++) {
-                JsonObject jsonobj = jsonseq.getJsonObject(i);
-                JsonArray cas = jsonobj.getJsonArray("cas");
-                JsonArray coords = jsonobj.getJsonArray("coords");
-                JsonArray keys = jsonobj.getJsonArray("keys");
-                ArrayList<MapillaryImage> images = new ArrayList<>();
-                for (int j = 0; j < cas.size(); j++) {
-                    try {
-                        images.add(new MapillaryImage(keys.getString(j),
-                                coords.getJsonArray(j).getJsonNumber(1)
-                                        .doubleValue(), coords.getJsonArray(j)
-                                        .getJsonNumber(0).doubleValue(), cas
-                                        .getJsonNumber(j).doubleValue()));
-                    } catch (IndexOutOfBoundsException e) {
-                        Main.warn("Mapillary bug at " + url);
-                        isSequenceWrong = true;
-                    }
-                }
-                if (isSequenceWrong)
-                    break;
-                MapillarySequence sequence = new MapillarySequence(
-                        jsonobj.getString("key"), jsonobj.getJsonNumber(
-                                "captured_at").longValue());
+			if (!jsonall.getBoolean("more") && !ex.isShutdown())
+				ex.shutdown();
+			JsonArray jsonseq = jsonall.getJsonArray("ss");
+			boolean isSequenceWrong = false;
+			for (int i = 0; i < jsonseq.size(); i++) {
+				JsonObject jsonobj = jsonseq.getJsonObject(i);
+				JsonArray cas = jsonobj.getJsonArray("cas");
+				JsonArray coords = jsonobj.getJsonArray("coords");
+				JsonArray keys = jsonobj.getJsonArray("keys");
+				ArrayList<MapillaryImage> images = new ArrayList<>();
+				for (int j = 0; j < cas.size(); j++) {
+					try {
+						images.add(new MapillaryImage(keys.getString(j),
+								coords.getJsonArray(j).getJsonNumber(1)
+										.doubleValue(), coords.getJsonArray(j)
+										.getJsonNumber(0).doubleValue(), cas
+										.getJsonNumber(j).doubleValue()));
+					} catch (IndexOutOfBoundsException e) {
+						Main.warn("Mapillary bug at " + url);
+						isSequenceWrong = true;
+					}
+				}
+				if (isSequenceWrong)
+					break;
+				MapillarySequence sequence = new MapillarySequence(
+						jsonobj.getString("key"), jsonobj.getJsonNumber(
+								"captured_at").longValue());
 
-               
+				List<MapillaryImage> finalImages = new ArrayList<>(images);
+				// Here it gets only those images which are in the downloaded
+				// area.
+				for (MapillaryAbstractImage img : images) {
+					if (!isInside(img))
+						finalImages.remove(img);
+				}
 
-                List<MapillaryImage> finalImages = new ArrayList<>(images);
-                // Here it gets only those images which are in the downloaded
-                // area.
-                for (MapillaryAbstractImage img : images) {
-                    if (!isInside(img))
-                    	finalImages.remove(img);
-                }
-                
-                for (MapillaryImage img : finalImages) {
-                    MapillaryData.getInstance().getImages().remove(img);
-                    img.setSequence(sequence);
-                }
-                MapillaryData.getInstance().addWithoutUpdate(
-                        new ArrayList<MapillaryAbstractImage>(finalImages));
-                sequence.add(finalImages);
-            }
-        } catch (IOException e) {
-            Main.error("Error reading the url " + url
-                    + " might be a Mapillary problem.");
-        }
-    }
+				boolean imagesAdded = false;
+				for (MapillaryImage img : finalImages) {
+					if (layer.data.getImages().contains(img))
+						((MapillaryImage) layer.data.getImages().get(
+								layer.data.getImages().indexOf(img)))
+								.setSequence(sequence);
+					else {
+						img.setSequence(sequence);
+						imagesAdded = true;
+					}
+				}
+				manager.imagesAdded = imagesAdded;
+				layer.data.addWithoutUpdate(
+						new ArrayList<MapillaryAbstractImage>(finalImages));
+				sequence.add(finalImages);
+			}
+		} catch (IOException e) {
+			Main.error("Error reading the url " + url
+					+ " might be a Mapillary problem.");
+		}
+	}
 
-    private boolean isInside(MapillaryAbstractImage image) {
-        for (int i = 0; i < bounds.size(); i++) {
-            if (bounds.get(i).contains(image.getLatLon()))
-                return true;
-        }
-        return false;
-    }
+	private boolean isInside(MapillaryAbstractImage image) {
+		for (int i = 0; i < bounds.size(); i++) {
+			if (bounds.get(i).contains(image.getLatLon()))
+				return true;
+		}
+		return false;
+	}
 }
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySignDownloaderThread.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySignDownloaderThread.java	(revision 31318)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySignDownloaderThread.java	(revision 31319)
@@ -14,70 +14,72 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
-import org.openstreetmap.josm.plugins.mapillary.MapillaryData;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryImage;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
 
 public class MapillarySignDownloaderThread implements Runnable {
 
-    private final String url;
-    private final ExecutorService ex;
+	private final String url;
+	private final ExecutorService ex;
+	private final MapillaryLayer layer;
 
-    public MapillarySignDownloaderThread(ExecutorService ex, String url) {
-        this.ex = ex;
-        this.url = url;
-    }
+	public MapillarySignDownloaderThread(ExecutorService ex, String url,
+			MapillaryLayer layer) {
+		this.ex = ex;
+		this.url = url;
+		this.layer = layer;
+	}
 
-    @Override
-    public void run() {
-        BufferedReader br;
-        try {
-            br = new BufferedReader(new InputStreamReader(
-                    new URL(url).openStream()));
-            JsonObject jsonobj = Json.createReader(br).readObject();
-            if (!jsonobj.getBoolean("more")) {
-                ex.shutdown();
-            }
-            JsonArray jsonarr = jsonobj.getJsonArray("ims");
-            for (int i = 0; i < jsonarr.size(); i++) {
-                JsonArray rects = jsonarr.getJsonObject(i)
-                        .getJsonArray("rects");
-                JsonArray rectversions = jsonarr.getJsonObject(i).getJsonArray(
-                        "rectversions");
-                String key = jsonarr.getJsonObject(i).getString("key");
-                if (rectversions != null) {
-                    for (int j = 0; j < rectversions.size(); j++) {
-                        rects = rectversions.getJsonObject(j).getJsonArray(
-                                "rects");
-                        for (int k = 0; k < rects.size(); k++) {
-                            JsonObject data = rects.getJsonObject(k);
-                            for (MapillaryAbstractImage image : MapillaryData
-                                    .getInstance().getImages())
-                                if (image instanceof MapillaryImage
-                                        && ((MapillaryImage) image).getKey()
-                                                .equals(key))
-                                    ((MapillaryImage) image).addSign(data
-                                            .getString("type"));
-                        }
-                    }
-                }
+	@Override
+	public void run() {
+		BufferedReader br;
+		try {
+			br = new BufferedReader(new InputStreamReader(
+					new URL(url).openStream()));
+			JsonObject jsonobj = Json.createReader(br).readObject();
+			if (!jsonobj.getBoolean("more")) {
+				ex.shutdown();
+			}
+			JsonArray jsonarr = jsonobj.getJsonArray("ims");
+			for (int i = 0; i < jsonarr.size(); i++) {
+				JsonArray rects = jsonarr.getJsonObject(i)
+						.getJsonArray("rects");
+				JsonArray rectversions = jsonarr.getJsonObject(i).getJsonArray(
+						"rectversions");
+				String key = jsonarr.getJsonObject(i).getString("key");
+				if (rectversions != null) {
+					for (int j = 0; j < rectversions.size(); j++) {
+						rects = rectversions.getJsonObject(j).getJsonArray(
+								"rects");
+						for (int k = 0; k < rects.size(); k++) {
+							JsonObject data = rects.getJsonObject(k);
+							for (MapillaryAbstractImage image : layer.data
+									.getImages())
+								if (image instanceof MapillaryImage
+										&& ((MapillaryImage) image).getKey()
+												.equals(key))
+									((MapillaryImage) image).addSign(data
+											.getString("type"));
+						}
+					}
+				}
 
-                // Just one sign on the picture
-                else if (rects != null) {
-                    for (int j = 0; j < rects.size(); j++) {
-                        JsonObject data = rects.getJsonObject(j);
-                        for (MapillaryAbstractImage image : MapillaryData
-                                .getInstance().getImages())
-                            if (image instanceof MapillaryImage
-                                    && ((MapillaryImage) image).getKey()
-                                            .equals(key))
-                                ((MapillaryImage) image).addSign(data
-                                        .getString("type"));
-                    }
-                }
-            }
-        } catch (MalformedURLException e) {
-            Main.error(e);
-        } catch (IOException e) {
-            Main.error(e);
-        }
-    }
+				// Just one sign on the picture
+				else if (rects != null) {
+					for (int j = 0; j < rects.size(); j++) {
+						JsonObject data = rects.getJsonObject(j);
+						for (MapillaryAbstractImage image : layer.data.getImages())
+							if (image instanceof MapillaryImage
+									&& ((MapillaryImage) image).getKey()
+											.equals(key))
+								((MapillaryImage) image).addSign(data
+										.getString("type"));
+					}
+				}
+			}
+		} catch (MalformedURLException e) {
+			Main.error(e);
+		} catch (IOException e) {
+			Main.error(e);
+		}
+	}
 }
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySquareDownloadManagerThread.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySquareDownloadManagerThread.java	(revision 31318)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/downloads/MapillarySquareDownloadManagerThread.java	(revision 31319)
@@ -8,5 +8,5 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.plugins.mapillary.MapillaryData;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryLayer;
 import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryFilterDialog;
 import org.openstreetmap.josm.plugins.mapillary.gui.MapillaryToggleDialog;
@@ -23,77 +23,83 @@
 public class MapillarySquareDownloadManagerThread implements Runnable {
 
-    private final String urlImages;
-    private final String urlSequences;
-    private final String urlSigns;
+	private final String urlImages;
+	private final String urlSequences;
+	private final String urlSigns;
+	private final MapillaryLayer layer;
+	public boolean imagesAdded = false;
 
-    public MapillarySquareDownloadManagerThread(String urlImages,
-            String urlSequences, String urlSigns) {
-        this.urlImages = urlImages;
-        this.urlSequences = urlSequences;
-        this.urlSigns = urlSigns;
-    }
+	public MapillarySquareDownloadManagerThread(String urlImages,
+			String urlSequences, String urlSigns, MapillaryLayer layer) {
+		this.urlImages = urlImages;
+		this.urlSequences = urlSequences;
+		this.urlSigns = urlSigns;
+		this.layer = layer;
+	}
 
-    public void run() {
-        Main.map.statusLine.setHelpText("Downloading images from Mapillary");
-        try {
-            downloadSequences();
-            Main.map.statusLine.setHelpText("Downloading image's information");
-            completeImages();
-            Main.map.statusLine.setHelpText("Downloading signs");
-            downloadSigns();
-        } catch (InterruptedException e) {
-            Main.error(e);
-        }
-        if (MapillaryData.getInstance().getImages().size() > 0)
-            Main.map.statusLine.setHelpText(tr("Total images: ")
-                    + MapillaryData.getInstance().getImages().size());
-        else
-            Main.map.statusLine.setHelpText(tr("No images found"));
-        MapillaryData.getInstance().dataUpdated();
-        MapillaryFilterDialog.getInstance().refresh();
-        MapillaryToggleDialog.getInstance().updateImage();
-    }
+	public void run() {
+		Main.map.statusLine.setHelpText("Downloading images from Mapillary");
+		try {
+			downloadSequences();
+			if (imagesAdded) {
+				Main.map.statusLine
+						.setHelpText("Downloading image's information");
+				completeImages();
+				Main.map.statusLine.setHelpText("Downloading signs");
+				downloadSigns();
+			}
+		} catch (InterruptedException e) {
+			Main.error(e);
+		}
+		if (layer.data.getImages().size() > 0)
+			Main.map.statusLine.setHelpText(tr("Total images: ")
+					+ layer.data.getImages().size());
+		else
+			Main.map.statusLine.setHelpText(tr("No images found"));
+		layer.data.dataUpdated();
+		MapillaryFilterDialog.getInstance().refresh();
+		MapillaryToggleDialog.getInstance().updateImage();
+	}
 
-    private void downloadSequences() throws InterruptedException {
-        ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25,
-                TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));
-        int page = 0;
-        while (!ex.isShutdown()) {
-            ex.execute(new MapillarySequenceDownloadThread(ex, urlSequences
-                    + "&page=" + page + "&limit=1"));
-            while (ex.getQueue().remainingCapacity() == 0)
-                Thread.sleep(100);
-            page++;
-        }
-        ex.awaitTermination(15, TimeUnit.SECONDS);
-        MapillaryData.getInstance().dataUpdated();
-    }
+	private void downloadSequences() throws InterruptedException {
+		ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25,
+				TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));
+		int page = 0;
+		while (!ex.isShutdown()) {
+			ex.execute(new MapillarySequenceDownloadThread(ex, urlSequences
+					+ "&page=" + page + "&limit=1", layer, this));
+			while (ex.getQueue().remainingCapacity() == 0)
+				Thread.sleep(100);
+			page++;
+		}
+		ex.awaitTermination(15, TimeUnit.SECONDS);
+		layer.data.dataUpdated();
+	}
 
-    private void completeImages() throws InterruptedException {
-        ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25,
-                TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));
-        int page = 0;
-        while (!ex.isShutdown()) {
-            ex.execute(new MapillaryImageInfoDownloaderThread(ex, urlImages
-                    + "&page=" + page + "&limit=20"));
-            while (ex.getQueue().remainingCapacity() == 0)
-                Thread.sleep(100);
-            page++;
-        }
-        ex.awaitTermination(15, TimeUnit.SECONDS);
-    }
+	private void completeImages() throws InterruptedException {
+		ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25,
+				TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));
+		int page = 0;
+		while (!ex.isShutdown()) {
+			ex.execute(new MapillaryImageInfoDownloaderThread(ex, urlImages
+					+ "&page=" + page + "&limit=20", layer));
+			while (ex.getQueue().remainingCapacity() == 0)
+				Thread.sleep(100);
+			page++;
+		}
+		ex.awaitTermination(15, TimeUnit.SECONDS);
+	}
 
-    private void downloadSigns() throws InterruptedException {
-        ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25,
-                TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));
-        int page = 0;
-        while (!ex.isShutdown()) {
-            ex.execute(new MapillarySignDownloaderThread(ex, urlSigns
-                    + "&page=" + page + "&limit=20"));
-            while (ex.getQueue().remainingCapacity() == 0)
-                Thread.sleep(100);
-            page++;
-        }
-        ex.awaitTermination(15, TimeUnit.SECONDS);
-    }
+	private void downloadSigns() throws InterruptedException {
+		ThreadPoolExecutor ex = new ThreadPoolExecutor(3, 5, 25,
+				TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5));
+		int page = 0;
+		while (!ex.isShutdown()) {
+			ex.execute(new MapillarySignDownloaderThread(ex, urlSigns
+					+ "&page=" + page + "&limit=20", layer));
+			while (ex.getQueue().remainingCapacity() == 0)
+				Thread.sleep(100);
+			page++;
+		}
+		ex.awaitTermination(15, TimeUnit.SECONDS);
+	}
 }
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 31318)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryFilterDialog.java	(revision 31319)
@@ -144,5 +144,5 @@
 	}
 
-	public void refresh() {
+	public synchronized void refresh() {
 		boolean imported = this.imported.isSelected();
 		boolean downloaded = this.downloaded.isSelected();
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryToggleDialog.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryToggleDialog.java	(revision 31318)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryToggleDialog.java	(revision 31319)
@@ -9,5 +9,4 @@
 import java.awt.Color;
 import java.awt.Component;
-import java.awt.Event;
 import java.awt.FlowLayout;
 import java.awt.GridLayout;
