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 31982)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryAbstractImage.java	(revision 31983)
@@ -196,5 +196,5 @@
   /**
    * If the MapillaryImage belongs to a MapillarySequence, returns the next
-   * MapillarySequence in it.
+   * image in the sequence.
    *
    * @return The following MapillaryImage, or null if there is none.
@@ -210,5 +210,5 @@
   /**
    * If the MapillaryImage belongs to a MapillarySequence, returns the previous
-   * MapillarySequence in it.
+   * image in the sequence.
    *
    * @return The previous MapillaryImage, or null if there is none.
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 31982)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryData.java	(revision 31983)
@@ -3,4 +3,5 @@
 
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -219,10 +220,22 @@
 
   /**
-   * Returns a List containing all images.
-   *
-   * @return A List object containing all images.
+   * Returns a Set containing all images.
+   *
+   * @return A Set object containing all images.
    */
   public synchronized Set<MapillaryAbstractImage> getImages() {
     return this.images;
+  }
+
+  /**
+   * Returns a Set of all sequences, that the images are part of.
+   * @return
+   */
+  public synchronized Set<MapillarySequence> getSequences() {
+    Set<MapillarySequence> result = new HashSet<>();
+    for (MapillaryAbstractImage img : getImages()) {
+      result.add(img.getSequence());
+    }
+    return result;
   }
 
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 31982)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java	(revision 31983)
@@ -6,4 +6,5 @@
 
 import java.awt.AlphaComposite;
+import java.awt.BasicStroke;
 import java.awt.Color;
 import java.awt.Composite;
@@ -12,8 +13,10 @@
 import java.awt.Point;
 import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.Shape;
 import java.awt.TexturePaint;
 import java.awt.event.ActionEvent;
 import java.awt.geom.AffineTransform;
-import java.awt.geom.Area;
+import java.awt.geom.Line2D;
 import java.awt.image.AffineTransformOp;
 import java.awt.image.BufferedImage;
@@ -59,4 +62,5 @@
 import org.openstreetmap.josm.plugins.mapillary.mode.JoinMode;
 import org.openstreetmap.josm.plugins.mapillary.mode.SelectMode;
+import org.openstreetmap.josm.plugins.mapillary.utils.MapViewGeometryUtil;
 import org.openstreetmap.josm.plugins.mapillary.utils.MapillaryUtils;
 
@@ -230,7 +234,8 @@
   @Override
   public boolean isModified() {
-    for (MapillaryAbstractImage image : this.data.getImages())
+    for (MapillaryAbstractImage image : this.data.getImages()) {
       if (image.isModified())
         return true;
+    }
     return false;
   }
@@ -280,31 +285,19 @@
 
   @Override
-  public synchronized void paint(Graphics2D g, MapView mv, Bounds box) {
+  public synchronized void paint(final Graphics2D g, final MapView mv, final Bounds box) {
+    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     if (Main.map.mapView.getActiveLayer() == this) {
-      Rectangle b = mv.getBounds();
-      // on some platforms viewport bounds seem to be offset from the left,
-      // over-grow it just to be sure
-      b.grow(100, 100);
-      Area a = new Area(b);
-      // now successively subtract downloaded areas
-      for (Bounds bounds : this.data.bounds) {
-        Point p1 = mv.getPoint(bounds.getMin());
-        Point p2 = mv.getPoint(bounds.getMax());
-        Rectangle r = new Rectangle(Math.min(p1.x, p2.x), Math.min(p1.y, p2.y),
-            Math.abs(p2.x - p1.x), Math.abs(p2.y - p1.y));
-        a.subtract(new Area(r));
-      }
       // paint remainder
       g.setPaint(this.hatched);
-      g.fill(a);
+      g.fill(MapViewGeometryUtil.getNonDownloadedArea(mv, this.data.bounds));
     }
 
     // Draw colored lines
+    MapillaryMainDialog.getInstance().blueButton.setEnabled(false);
+    MapillaryMainDialog.getInstance().redButton.setEnabled(false);
     blue = null;
     red = null;
-    MapillaryMainDialog.getInstance().blueButton.setEnabled(false);
-    MapillaryMainDialog.getInstance().redButton.setEnabled(false);
-
-    // Sets blue and red lines and enables/disables the buttons
+
+    // Draw the blue and red line and enable/disable the buttons
     if (this.data.getSelectedImage() != null) {
       MapillaryImage[] closestImages = getClosestImagesFromDifferentSequences();
@@ -313,6 +306,6 @@
         blue = closestImages[0];
         g.setColor(Color.BLUE);
-        g.drawLine(mv.getPoint(closestImages[0].getLatLon()).x,
-            mv.getPoint(closestImages[0].getLatLon()).y, selected.x, selected.y);
+        final Point p = mv.getPoint(closestImages[0].getLatLon());
+        g.draw(new Line2D.Double(p.getX(), p.getY(), selected.getX(), selected.getY()));
         MapillaryMainDialog.getInstance().blueButton.setEnabled(true);
       }
@@ -320,45 +313,31 @@
         red = closestImages[1];
         g.setColor(Color.RED);
-        g.drawLine(mv.getPoint(closestImages[1].getLatLon()).x,
-            mv.getPoint(closestImages[1].getLatLon()).y, selected.x, selected.y);
+        final Point p = mv.getPoint(closestImages[1].getLatLon());
+        g.draw(new Line2D.Double(p.getX(), p.getY(), selected.getX(), selected.getY()));
         MapillaryMainDialog.getInstance().redButton.setEnabled(true);
       }
     }
+    // Draw sequence line
     g.setColor(Color.WHITE);
+    g.setStroke(new BasicStroke(this == Main.map.mapView.getActiveLayer() ? 3 : 1));
+    for (MapillarySequence seq : getData().getSequences()) {
+      g.draw(MapViewGeometryUtil.getSequencePath(mv, seq));
+    }
     for (MapillaryAbstractImage imageAbs : this.data.getImages()) {
-      if (!imageAbs.isVisible())
-        continue;
-      Point p = mv.getPoint(imageAbs.getLatLon());
-      Point nextp = null;
-      // Draw sequence line
-      if (imageAbs.getSequence() != null) {
-        MapillaryAbstractImage tempImage = imageAbs.next();
-        while (tempImage != null) {
-          if (tempImage.isVisible()) {
-            nextp = mv.getPoint(tempImage.getLatLon());
-            break;
-          }
-          tempImage = tempImage.next();
+      if (imageAbs.isVisible()) {
+        final Point p = mv.getPoint(imageAbs.getLatLon());
+        if (getData().getMultiSelectedImages().contains(imageAbs)) {
+          draw(g, imageAbs, MapillaryPlugin.MAP_ICON_SELECTED, p);
+        } else {
+          draw(g, imageAbs, imageAbs instanceof MapillaryImage ? MapillaryPlugin.MAP_ICON : MapillaryPlugin.MAP_ICON_IMPORTED, p);
         }
-        if (nextp != null)
-          g.drawLine(p.x, p.y, nextp.x, nextp.y);
-      }
-      // Draws icons
-      if (imageAbs instanceof MapillaryImage) {
-        MapillaryImage image = (MapillaryImage) imageAbs;
-        ImageIcon icon;
-        icon = this.data.getMultiSelectedImages().contains(image) ? MapillaryPlugin.MAP_ICON_SELECTED : MapillaryPlugin.MAP_ICON;
-        draw(g, image, icon, p);
-        if (!image.getSigns().isEmpty()) {
-          g.drawImage(MapillaryPlugin.MAP_SIGN.getImage(),
-              p.x + icon.getIconWidth() / 2, p.y - icon.getIconHeight() / 2,
-              Main.map.mapView);
+        if (imageAbs instanceof MapillaryImage && !((MapillaryImage) imageAbs).getSigns().isEmpty()) {
+          g.drawImage(
+              MapillaryPlugin.MAP_SIGN.getImage(),
+              p.x - MapillaryPlugin.MAP_SIGN.getIconWidth() / 2,
+              p.y - MapillaryPlugin.MAP_SIGN.getIconHeight() / 2,
+              Main.map.mapView
+          );
         }
-      } else if (imageAbs instanceof MapillaryImportedImage) {
-        MapillaryImportedImage image = (MapillaryImportedImage) imageAbs;
-        ImageIcon icon = this.data.getMultiSelectedImages().contains(image)
-            ? MapillaryPlugin.MAP_ICON_SELECTED
-            : MapillaryPlugin.MAP_ICON_IMPORTED;
-        draw(g, image, icon, p);
       }
     }
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 31982)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryPlugin.java	(revision 31983)
@@ -97,5 +97,15 @@
 
   static {
-    if (Main.main != null) {
+    if (Main.main == null) {
+      exportMenu = null;
+      downloadMenu = null;
+      importMenu = null;
+      zoomMenu = null;
+      downloadViewMenu = null;
+      importIntoSequenceMenu = null;
+      joinMenu = null;
+      walkMenu = null;
+      uploadMenu = null;
+    } else {
       exportMenu = MainMenu.add(Main.main.menu.fileMenu, exportAction, false, 14);
       exportMenu.setEnabled(false);
@@ -116,14 +126,4 @@
       uploadMenu = MainMenu.add(Main.main.menu.fileMenu, uploadAction, false, 14);
       uploadMenu.setEnabled(false);
-    } else {
-      exportMenu = null;
-      downloadMenu = null;
-      importMenu = null;
-      zoomMenu = null;
-      downloadViewMenu = null;
-      importIntoSequenceMenu = null;
-      joinMenu = null;
-      walkMenu = null;
-      uploadMenu = null;
     }
   }
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/oauth/UploadUtils.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/oauth/UploadUtils.java	(revision 31982)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/oauth/UploadUtils.java	(revision 31983)
@@ -56,24 +56,22 @@
  */
 public class UploadUtils {
+  /**
+   * Required keys for POST
+   */
+  private static final String[] keys = {"key", "AWSAccessKeyId", "acl", "policy", "signature", "Content-Type"};
+
+  /**
+   * Mapillary upload URL
+   */
+  private static final String UPLOAD_URL = "https://s3-eu-west-1.amazonaws.com/mapillary.uploads.manual.images";
+
+  /**
+   * Count to name temporal files.
+   */
+  private static int c;
 
   private UploadUtils() {
     // Private constructor to avoid instantiation.
   }
-
-  /**
-   * Required keys for POST
-   */
-  private static final String[] keys = {"key", "AWSAccessKeyId", "acl",
-          "policy", "signature", "Content-Type"};
-
-  /**
-   * Mapillary upload URL
-   */
-  private static final String UPLOAD_URL = "https://s3-eu-west-1.amazonaws.com/mapillary.uploads.manual.images";
-
-  /**
-   * Count to name temporal files.
-   */
-  private static int c;
 
   private static class SequenceUploadThread extends Thread {
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/utils/MapViewGeometryUtil.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/utils/MapViewGeometryUtil.java	(revision 31983)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/utils/MapViewGeometryUtil.java	(revision 31983)
@@ -0,0 +1,70 @@
+package org.openstreetmap.josm.plugins.mapillary.utils;
+
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.geom.Area;
+import java.awt.geom.Path2D;
+
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
+import org.openstreetmap.josm.plugins.mapillary.MapillarySequence;
+
+/**
+ * Utility class to convert entities like {@link Bounds} and {@link MapillarySequence} into {@link Shape}s that
+ * can then easily be drawn on a {@link MapView}s {@link Graphics2D}-context.
+ */
+public final  class MapViewGeometryUtil {
+  private MapViewGeometryUtil() {
+    // Private constructor to avoid instantiation
+  }
+
+  /**
+   * Subtracts the download bounds from the rectangular bounds of the map view.
+   * @param mv the MapView that is used for the LatLon-to-Point-conversion and that determines
+   *     the Bounds from which the downloaded Bounds are subtracted
+   * @param downloadBounds multiple {@link Bounds} objects that represent the downloaded area
+   * @return the difference between the {@link MapView}s bounds and the downloaded area
+   */
+  public static Area getNonDownloadedArea(MapView mv, Iterable<Bounds> downloadBounds) {
+    Rectangle b = mv.getBounds();
+    // on some platforms viewport bounds seem to be offset from the left,
+    // over-grow it just to be sure
+    b.grow(100, 100);
+    Area a = new Area(b);
+    // now successively subtract downloaded areas
+    for (Bounds bounds : downloadBounds) {
+      Point p1 = mv.getPoint(bounds.getMin());
+      Point p2 = mv.getPoint(bounds.getMax());
+      Rectangle r = new Rectangle(Math.min(p1.x, p2.x), Math.min(p1.y, p2.y),
+          Math.abs(p2.x - p1.x), Math.abs(p2.y - p1.y));
+      a.subtract(new Area(r));
+    }
+    Shape s = null;
+    return a;
+  }
+
+  /**
+   * Converts a {@link MapillarySequence} into a {@link Path2D} that can be drawn
+   * on the specified {@link MapView}'s {@link Graphics2D}-context.
+   * @param mv the {@link MapView} for which this conversion should be performed
+   * @param seq the sequence to convert
+   * @return the {@link Path2D} object to which the {@link MapillarySequence} has been converted
+   */
+  public static Path2D getSequencePath(MapView mv, MapillarySequence seq) {
+    Path2D.Double path = new Path2D.Double();
+    for (MapillaryAbstractImage img : seq.getImages()) {
+      if (img.isVisible()) {
+        Point p = mv.getPoint(img.getLatLon());
+        if (path.getCurrentPoint() == null) {
+          path.moveTo(p.getX(), p.getY());
+        } else {
+          path.lineTo(p.getX(), p.getY());
+        }
+      }
+    }
+    return path;
+  }
+}
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 31982)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/utils/MapillaryUtils.java	(revision 31983)
@@ -5,4 +5,7 @@
 
 import java.awt.Desktop;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.geom.Area;
 import java.io.File;
 import java.io.IOException;
@@ -11,5 +14,8 @@
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.Set;
 
 import javax.swing.SwingUtilities;
@@ -26,4 +32,5 @@
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryAbstractImage;
 import org.openstreetmap.josm.plugins.mapillary.MapillaryData;
@@ -129,7 +136,8 @@
       throw new IllegalArgumentException("Array's length must be 3.");
     }
-    for (int i = 0; i < 3; i++)
+    for (int i = 0; i < 3; i++) {
       if (degMinSec[i] == null)
         throw new IllegalArgumentException("Null value in array.");
+    }
 
     switch (ref) {
