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 31299)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryData.java	(revision 31300)
@@ -156,5 +156,5 @@
     /**
      * If the selected MapillaryImage is part of a MapillarySequence then the
-     * following MapillaryImage is selected. In case there is none, does
+     * following visible MapillaryImage is selected. In case there is none, does
      * nothing.
      */
@@ -165,5 +165,14 @@
             if (((MapillaryImage) getSelectedImage()).getSequence() == null)
                 return;
-            setSelectedImage(((MapillaryImage) getSelectedImage()).next(), true);
+            if (selectedImage instanceof MapillaryImage && ((MapillaryImage) selectedImage).getSequence() != null) {
+				MapillaryImage tempImage = (MapillaryImage) selectedImage;
+				while (tempImage.next() != null) {
+					tempImage = tempImage.next();
+					if (tempImage.isVisible()) {
+			            setSelectedImage(tempImage, true);
+						break;
+					}
+				}
+			}
         }
     }
@@ -171,5 +180,5 @@
     /**
      * If the selected MapillaryImage is part of a MapillarySequence then the
-     * previous MapillaryImage is selected. In case there is none, does nothing.
+     * previous visible MapillaryImage is selected. In case there is none, does nothing.
      */
     public void selectPrevious() {
@@ -179,6 +188,14 @@
             if (((MapillaryImage) getSelectedImage()).getSequence() == null)
                 throw new IllegalStateException();
-            setSelectedImage(((MapillaryImage) getSelectedImage()).previous(),
-                    true);
+            if (selectedImage instanceof MapillaryImage && ((MapillaryImage) selectedImage).getSequence() != null) {
+				MapillaryImage tempImage = (MapillaryImage) selectedImage;
+				while (tempImage.previous() != null) {
+					tempImage = tempImage.previous();
+					if (tempImage.isVisible()) {
+			            setSelectedImage(tempImage, true);
+						break;
+					}
+				}
+			}
         }
     }
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 31299)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/MapillaryLayer.java	(revision 31300)
@@ -312,11 +312,17 @@
 				if (imageAbs instanceof MapillaryImage) {
 					MapillaryImage image = (MapillaryImage) imageAbs;
-					Point nextp;
+					Point nextp = null;
 					// Draw sequence line
-					if (image.getSequence() != null && image.next() != null
-							&& image.next().isVisible()) {
-						nextp = mv.getPoint(image.getSequence().next(image)
-								.getLatLon());
-						g.drawLine(p.x, p.y, nextp.x, nextp.y);
+					if (image.getSequence() != null) {
+						MapillaryImage tempImage = image;
+						while (tempImage.next() != null) {
+							tempImage = tempImage.next();
+							if (tempImage.isVisible()) {
+								nextp = mv.getPoint(tempImage.getLatLon());
+								break;
+							}
+						}
+						if (nextp != null)
+							g.drawLine(p.x, p.y, nextp.x, nextp.y);
 					}
 
Index: applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryFilterChooseSigns.java
===================================================================
--- applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryFilterChooseSigns.java	(revision 31299)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryFilterChooseSigns.java	(revision 31300)
@@ -15,13 +15,20 @@
         ActionListener {
 
-    private final JCheckBox maxspeed = new JCheckBox();
-    private final JCheckBox stop = new JCheckBox();
-    private final JCheckBox giveWay = new JCheckBox();
-    private final JCheckBox roundabout = new JCheckBox();
-    private final JCheckBox access = new JCheckBox();
+    public final JCheckBox maxspeed = new JCheckBox();
+    public final JCheckBox stop = new JCheckBox();
+    public final JCheckBox giveWay = new JCheckBox();
+    public final JCheckBox roundabout = new JCheckBox();
+    public final JCheckBox access = new JCheckBox();
 
     private static MapillaryFilterChooseSigns INSTANCE;
 
     public MapillaryFilterChooseSigns() {
+    	maxspeed.setSelected(true);
+    	stop.setSelected(true);
+    	giveWay.setSelected(true);
+    	roundabout.setSelected(true);
+    	access.setSelected(true);
+
+    	
         // Max speed sign
         JPanel maxspeedPanel = new JPanel();
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 31299)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryFilterDialog.java	(revision 31300)
@@ -38,229 +38,261 @@
  */
 public class MapillaryFilterDialog extends ToggleDialog implements
-        MapillaryDataListener {
-
-    public static MapillaryFilterDialog INSTANCE;
-
-    private final static String[] TIME_LIST = { tr("All time"),
-            tr("This year"), tr("This month"), tr("This week") };
-
-    private final static int ROWS = 0;
-    private final static int COLUMNS = 3;
-
-    private final JPanel panel;
-
-    private final JCheckBox imported;
-    private final JCheckBox downloaded;
-    private final JCheckBox onlySigns;
-    private final JComboBox<String> time;
-    private final JTextField user;
-
-    private final SideButton updateButton;
-    private final SideButton resetButton;
-    private final JButton signChooser;
-
-    public MapillaryFilterDialog() {
-        super(tr("Mapillary filter"), "mapillaryfilter.png",
-                tr("Open Mapillary filter dialog"), Shortcut.registerShortcut(
-                        tr("Mapillary filter"),
-                        tr("Open Mapillary filter dialog"), KeyEvent.VK_M,
-                        Shortcut.NONE), 200);
-        panel = new JPanel(new GridLayout(ROWS, COLUMNS));
-
-        imported = new JCheckBox("Imported images");
-        downloaded = new JCheckBox(new downloadCheckBoxAction());
-        onlySigns = new JCheckBox(new OnlySignsAction());
-
-        signChooser = new JButton(new SignChooserAction());
-        JPanel signChooserPanel = new JPanel();
-        signChooserPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
-        signChooserPanel.add(signChooser);
-
-        JPanel comboPanel = new JPanel();
-        comboPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
-        comboPanel.add(new JLabel("From"));
-        time = new JComboBox<>(TIME_LIST);
-        comboPanel.add(time);
-
-        JPanel userSearchPanel = new JPanel();
-        userSearchPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
-        user = new JTextField(15);
-        user.addActionListener(new UpdateAction());
-        userSearchPanel.add(new JLabel("User"));
-        userSearchPanel.add(user);
-
-        imported.setSelected(true);
-        downloaded.setSelected(true);
-
-        updateButton = new SideButton(new UpdateAction());
-        resetButton = new SideButton(new ResetAction());
-
-        panel.add(downloaded);
-        panel.add(imported);
-        panel.add(onlySigns);
-        panel.add(comboPanel);
-        panel.add(userSearchPanel);
-        panel.add(signChooserPanel);
-
-        createLayout(panel, true,
-                Arrays.asList(new SideButton[] { updateButton, resetButton }));
-    }
-
-    public static MapillaryFilterDialog getInstance() {
-        if (INSTANCE == null)
-            INSTANCE = new MapillaryFilterDialog();
-        return INSTANCE;
-    }
-
-    @Override
-    public void imagesAdded() {
-        refresh();
-    }
-
-    @Override
-    public void selectedImageChanged(MapillaryAbstractImage oldImage,
-            MapillaryAbstractImage newImage) {
-    }
-
-    public void reset() {
-        imported.setSelected(true);
-        downloaded.setSelected(true);
-        onlySigns.setEnabled(true);
-        onlySigns.setSelected(false);
-        user.setText("");
-        time.setSelectedItem(TIME_LIST[0]);
-        refresh();
-    }
-
-    public void refresh() {
-        boolean imported = this.imported.isSelected();
-        boolean downloaded = this.downloaded.isSelected();
-        boolean onlySigns = this.onlySigns.isSelected();
-
-        for (MapillaryAbstractImage img : MapillaryData.getInstance()
-                .getImages()) {
-            img.setVisible(true);
-            if (img instanceof MapillaryImportedImage) {
-                if (!imported)
-                    img.setVisible(false);
-                continue;
-            } else if (img instanceof MapillaryImage) {
-                if (!downloaded) {
-                    img.setVisible(false);
-                    continue;
-                }
-                if (onlySigns) {
-                    if (((MapillaryImage) img).getSigns().isEmpty()) {
-                        img.setVisible(false);
-                        continue;
-                    }
-                }
-                if (!user.getText().equals("")
-                        && !user.getText().equals(
-                                ((MapillaryImage) img).getUser())) {
-                    img.setVisible(false);
-                    continue;
-                }
-            }
-            // Calculates the amount of days since the image was taken
-            Long currentTime = currentTime();
-            if (time.getSelectedItem() == TIME_LIST[1]) {
-                if ((currentTime - img.getCapturedAt()) / (24 * 60 * 60 * 1000) > 365) {
-                    img.setVisible(false);
-                    continue;
-                }
-            }
-            if (time.getSelectedItem() == TIME_LIST[2]) {
-                if ((currentTime - img.getCapturedAt()) / (24 * 60 * 60 * 1000) > 30) {
-                    img.setVisible(false);
-                    continue;
-                }
-            }
-            if (time.getSelectedItem() == TIME_LIST[3]) {
-                if ((currentTime - img.getCapturedAt()) / (24 * 60 * 60 * 1000) > 7) {
-                    img.setVisible(false);
-                    continue;
-                }
-            }
-        }
-        MapillaryData.getInstance().dataUpdated();
-    }
-
-    private long currentTime() {
-        Calendar cal = Calendar.getInstance();
-        return cal.getTimeInMillis();
-    }
-
-    private class downloadCheckBoxAction extends AbstractAction {
-
-        public downloadCheckBoxAction() {
-            putValue(NAME, tr("Downloaded images"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent arg0) {
-            onlySigns.setEnabled(downloaded.isSelected());
-        }
-    }
-
-    private class UpdateAction extends AbstractAction {
-        public UpdateAction() {
-            putValue(NAME, tr("Update"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent arg0) {
-            MapillaryFilterDialog.getInstance().refresh();
-        }
-    }
-
-    private class ResetAction extends AbstractAction {
-        public ResetAction() {
-            putValue(NAME, tr("Reset"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent arg0) {
-            MapillaryFilterDialog.getInstance().reset();
-        }
-    }
-
-    private class OnlySignsAction extends AbstractAction {
-        public OnlySignsAction() {
-            putValue(NAME, tr("Only images with signs"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent arg0) {
-            signChooser.setEnabled(onlySigns.isSelected());
-        }
-    }
-
-    /**
-     * Opens a new window where you can specifically filter signs.
-     * 
-     * @author nokutu
-     *
-     */
-    private class SignChooserAction extends AbstractAction {
-        public SignChooserAction() {
-            putValue(NAME, tr("Choose signs"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent arg0) {
-            JPanel dialog = MapillaryFilterChooseSigns.getInstance();
-            JOptionPane pane = new JOptionPane(dialog,
-                    JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
-            JDialog dlg = pane.createDialog(Main.parent, tr("Choose signs"));
-            dlg.setMinimumSize(new Dimension(400, 150));
-            dlg.setVisible(true);
-            MapillaryFilterDialog.getInstance().refresh();
-            dlg.dispose();
-        }
-    }
-
-    public static void destroyInstance() {
-        MapillaryFilterDialog.INSTANCE = null;
-    }
+		MapillaryDataListener {
+
+	public static MapillaryFilterDialog INSTANCE;
+
+	private final static String[] TIME_LIST = { tr("All time"),
+			tr("This year"), tr("This month"), tr("This week") };
+
+	private final static int ROWS = 0;
+	private final static int COLUMNS = 3;
+
+	private final JPanel panel = new JPanel(new GridLayout(ROWS, COLUMNS));
+
+	private final JCheckBox imported = new JCheckBox("Imported images");
+	private final JCheckBox downloaded = new JCheckBox(new downloadCheckBoxAction());
+	private final JCheckBox onlySigns = new JCheckBox(new OnlySignsAction());
+	private final JComboBox<String> time;
+	private final JTextField user;
+
+	private final SideButton updateButton = new SideButton(new UpdateAction());
+	private final SideButton resetButton = new SideButton(new ResetAction());
+	private final JButton signChooser = new JButton(new SignChooserAction());
+
+	public final MapillaryFilterChooseSigns signFilter = MapillaryFilterChooseSigns
+			.getInstance();
+
+	public MapillaryFilterDialog() {
+		super(tr("Mapillary filter"), "mapillaryfilter.png",
+				tr("Open Mapillary filter dialog"), Shortcut.registerShortcut(
+						tr("Mapillary filter"),
+						tr("Open Mapillary filter dialog"), KeyEvent.VK_M,
+						Shortcut.NONE), 200);
+
+ 
+		signChooser.setEnabled(false);
+		JPanel signChooserPanel = new JPanel();
+		signChooserPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
+		signChooserPanel.add(signChooser);
+
+		JPanel comboPanel = new JPanel();
+		comboPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
+		comboPanel.add(new JLabel("From"));
+		time = new JComboBox<>(TIME_LIST);
+		comboPanel.add(time);
+
+		JPanel userSearchPanel = new JPanel();
+		userSearchPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
+		user = new JTextField(15);
+		user.addActionListener(new UpdateAction());
+		userSearchPanel.add(new JLabel("User"));
+		userSearchPanel.add(user);
+
+		imported.setSelected(true);
+		downloaded.setSelected(true);
+
+		panel.add(downloaded);
+		panel.add(imported);
+		panel.add(onlySigns);
+		panel.add(comboPanel);
+		panel.add(userSearchPanel);
+		panel.add(signChooserPanel);
+
+		createLayout(panel, true,
+				Arrays.asList(new SideButton[] { updateButton, resetButton }));
+	}
+
+	public static MapillaryFilterDialog getInstance() {
+		if (INSTANCE == null)
+			INSTANCE = new MapillaryFilterDialog();
+		return INSTANCE;
+	}
+
+	@Override
+	public void imagesAdded() {
+		refresh();
+	}
+
+	@Override
+	public void selectedImageChanged(MapillaryAbstractImage oldImage,
+			MapillaryAbstractImage newImage) {
+	}
+
+	public void reset() {
+		imported.setSelected(true);
+		downloaded.setSelected(true);
+		onlySigns.setEnabled(true);
+		onlySigns.setSelected(false);
+		user.setText("");
+		time.setSelectedItem(TIME_LIST[0]);
+		refresh();
+	}
+
+	public void refresh() {
+		boolean imported = this.imported.isSelected();
+		boolean downloaded = this.downloaded.isSelected();
+		boolean onlySigns = this.onlySigns.isSelected();
+
+		for (MapillaryAbstractImage img : MapillaryData.getInstance()
+				.getImages()) {
+			img.setVisible(true);
+			if (img instanceof MapillaryImportedImage) {
+				if (!imported)
+					img.setVisible(false);
+				continue;
+			} else if (img instanceof MapillaryImage) {
+				if (!downloaded) {
+					img.setVisible(false);
+					continue;
+				}
+				if (onlySigns) {
+					if (((MapillaryImage) img).getSigns().isEmpty()) {
+						img.setVisible(false);
+						continue;
+					}
+					if (!checkSigns((MapillaryImage) img)) {
+						img.setVisible(false);
+						continue;
+					}
+				}
+				if (!user.getText().equals("")
+						&& !user.getText().equals(
+								((MapillaryImage) img).getUser())) {
+					img.setVisible(false);
+					continue;
+				}
+			}
+			// Calculates the amount of days since the image was taken
+			Long currentTime = currentTime();
+			if (time.getSelectedItem() == TIME_LIST[1]) {
+				if ((currentTime - img.getCapturedAt()) / (24 * 60 * 60 * 1000) > 365) {
+					img.setVisible(false);
+					continue;
+				}
+			}
+			if (time.getSelectedItem() == TIME_LIST[2]) {
+				if ((currentTime - img.getCapturedAt()) / (24 * 60 * 60 * 1000) > 30) {
+					img.setVisible(false);
+					continue;
+				}
+			}
+			if (time.getSelectedItem() == TIME_LIST[3]) {
+				if ((currentTime - img.getCapturedAt()) / (24 * 60 * 60 * 1000) > 7) {
+					img.setVisible(false);
+					continue;
+				}
+			}
+		}
+		MapillaryData.getInstance().dataUpdated();
+	}
+
+	private boolean checkSigns(MapillaryImage img) {
+		// TODO move strings into an arraylist
+		if (checkSign(img, signFilter.maxspeed, "prohibitory_speed_limit"))
+			return true;
+		
+		if (checkSign(img, signFilter.stop, "priority_stop"))
+			return true;
+		
+		if (checkSign(img, signFilter.giveWay, "other_give_way"))
+			return true;
+		
+		if (checkSign(img, signFilter.roundabout, "mandatory_roundabout"))
+			return true;
+		
+		if (checkSign(img, signFilter.access, "other_no_entry"))
+			return true;
+
+		return false;
+	}
+	
+	private boolean checkSign(MapillaryImage img, JCheckBox signCheckBox, String singString) {
+		boolean contains = false;
+		for (String sign : img.getSigns()) {
+			if (sign.contains(singString))
+				contains = true;
+		}
+		if (contains == signCheckBox.isSelected() && contains)
+			return true;
+		return false;
+	}
+
+	private long currentTime() {
+		Calendar cal = Calendar.getInstance();
+		return cal.getTimeInMillis();
+	}
+
+	private class downloadCheckBoxAction extends AbstractAction {
+
+		public downloadCheckBoxAction() {
+			putValue(NAME, tr("Downloaded images"));
+		}
+
+		@Override
+		public void actionPerformed(ActionEvent arg0) {
+			onlySigns.setEnabled(downloaded.isSelected());
+		}
+	}
+
+	private class UpdateAction extends AbstractAction {
+		public UpdateAction() {
+			putValue(NAME, tr("Update"));
+		}
+
+		@Override
+		public void actionPerformed(ActionEvent arg0) {
+			MapillaryFilterDialog.getInstance().refresh();
+		}
+	}
+
+	private class ResetAction extends AbstractAction {
+		public ResetAction() {
+			putValue(NAME, tr("Reset"));
+		}
+
+		@Override
+		public void actionPerformed(ActionEvent arg0) {
+			MapillaryFilterDialog.getInstance().reset();
+		}
+	}
+
+	private class OnlySignsAction extends AbstractAction {
+		public OnlySignsAction() {
+			putValue(NAME, tr("Only images with signs"));
+		}
+
+		@Override
+		public void actionPerformed(ActionEvent arg0) {
+			signChooser.setEnabled(onlySigns.isSelected());
+		}
+	}
+
+	/**
+	 * Opens a new window where you can specifically filter signs.
+	 * 
+	 * @author nokutu
+	 *
+	 */
+	private class SignChooserAction extends AbstractAction {
+		public SignChooserAction() {
+			putValue(NAME, tr("Choose signs"));
+		}
+
+		@Override
+		public void actionPerformed(ActionEvent arg0) {
+			JPanel dialog = MapillaryFilterChooseSigns.getInstance();
+			JOptionPane pane = new JOptionPane(dialog,
+					JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
+			JDialog dlg = pane.createDialog(Main.parent, tr("Choose signs"));
+			dlg.setMinimumSize(new Dimension(400, 150));
+			dlg.setVisible(true);
+			if ((int) pane.getValue() == JOptionPane.OK_OPTION)
+				MapillaryFilterDialog.getInstance().refresh();
+			dlg.dispose();
+		}
+	}
+
+	public static void destroyInstance() {
+		MapillaryFilterDialog.INSTANCE = null;
+	}
 }
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 31299)
+++ applications/editors/josm/plugins/mapillary/src/org/openstreetmap/josm/plugins/mapillary/gui/MapillaryToggleDialog.java	(revision 31300)
@@ -125,12 +125,27 @@
 					title += " -- " + mapillaryImage.getDate();
 				setTitle(title);
-				this.nextButton.setEnabled(true);
-				this.previousButton.setEnabled(true);
-				if (mapillaryImage.next() == null
-						|| !mapillaryImage.next().isVisible())
-					this.nextButton.setEnabled(false);
-				if (mapillaryImage.previous() == null
-						|| !mapillaryImage.previous().isVisible())
-					this.previousButton.setEnabled(false);
+				this.nextButton.setEnabled(false);
+				this.previousButton.setEnabled(false);
+				// Enables/disables next/previous buttons
+				if (((MapillaryImage) image).getSequence() != null) {
+					MapillaryImage tempImage = (MapillaryImage) image;
+					while (tempImage.next() != null) {
+						tempImage = tempImage.next();
+						if (tempImage.isVisible()) {
+							this.nextButton.setEnabled(true);
+							break;
+						}
+					}
+				}
+				if (((MapillaryImage) image).getSequence() != null) {
+					MapillaryImage tempImage = (MapillaryImage) image;
+					while (tempImage.previous() != null) {
+						tempImage = tempImage.previous();
+						if (tempImage.isVisible()) {
+							this.previousButton.setEnabled(true);
+							break;
+						}
+					}
+				}
 
 				mapillaryImageDisplay.hyperlink.setURL(mapillaryImage.getKey());
