Index: /applications/editors/josm/plugins/videomapping/.classpath
===================================================================
--- /applications/editors/josm/plugins/videomapping/.classpath	(revision 30638)
+++ /applications/editors/josm/plugins/videomapping/.classpath	(revision 30639)
@@ -4,13 +4,9 @@
 	<classpathentry kind="src" path="test"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
-	<classpathentry exported="true" kind="lib" path="lib/vlcj-2.1.0.jar" sourcepath="lib/vlcj-2.1.0-sources.jar">
-		<attributes>
-			<attribute name="javadoc_location" value="jar:platform:/resource/VideoMapping/lib/vlcj-2.1.0-javadoc.jar!/"/>
-		</attributes>
-	</classpathentry>
 	<classpathentry combineaccessrules="false" kind="src" path="/JOSM"/>
-	<classpathentry exported="true" kind="lib" path="lib/jna-3.4.0.jar"/>
-	<classpathentry exported="true" kind="lib" path="lib/platform-3.4.0.jar"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/JOSM-log4j"/>
+	<classpathentry kind="lib" path="lib/jna-3.5.2.jar"/>
+	<classpathentry kind="lib" path="lib/platform-3.5.2.jar"/>
+	<classpathentry kind="lib" path="lib/vlcj-3.0.1.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
Index: /applications/editors/josm/plugins/videomapping/build.xml
===================================================================
--- /applications/editors/josm/plugins/videomapping/build.xml	(revision 30638)
+++ /applications/editors/josm/plugins/videomapping/build.xml	(revision 30639)
@@ -14,7 +14,7 @@
     <import file="../build-common.xml"/>
 
-    <property name="vlcj" value="${plugin.lib.dir}/vlcj-2.1.0.jar"/>
-    <property name="jna" value="${plugin.lib.dir}/jna-3.4.0.jar"/>
-    <property name="platform" value="${plugin.lib.dir}/platform-3.4.0.jar"/>
+    <property name="vlcj" value="${plugin.lib.dir}/vlcj-3.0.1.jar"/>
+    <property name="jna" value="${plugin.lib.dir}/jna-3.5.2.jar"/>
+    <property name="platform" value="${plugin.lib.dir}/platform-3.5.2.jar"/>
     <!-- classpath -->
     <path id="classpath">
Index: /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoPlugin.java
===================================================================
--- /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoPlugin.java	(revision 30638)
+++ /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoPlugin.java	(revision 30639)
@@ -65,5 +65,5 @@
     private GPSVideoPlayer gpsVideoPlayer;
 
-    public static String VLC_VERSION = "2.0.x";
+    public static String VLC_VERSION = "2.1.x";
 
     public VideoPlugin(PluginInformation info) {
Index: /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoPositionLayer.java
===================================================================
--- /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoPositionLayer.java	(revision 30638)
+++ /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoPositionLayer.java	(revision 30639)
@@ -1,4 +1,3 @@
 package org.openstreetmap.josm.plugins.videomapping;
-
 
 import static org.openstreetmap.josm.tools.I18n.tr;
@@ -39,27 +38,26 @@
 //Basic rendering and GPS layer interaction
 public class VideoPositionLayer extends Layer implements MouseListener,MouseMotionListener {
-	private List<WayPoint> gpsTrack;
-	private ImageIcon layerIcon;
-	private DateFormat gpsTimeFormat;
-	private WayPoint iconPosition;
-	private final int GPS_INTERVALL=1000;
-	private GPSVideoPlayer gpsVideoPlayer;
-	private boolean autoCenter;
-
-	public VideoPositionLayer(GpxLayer gpsLayer) {
-		super("videolayer");
-		layerIcon = new ImageIcon("images/videomapping.png");
-		gpsTrack=importGPSLayer(gpsLayer.data);
-		gpsTimeFormat= new SimpleDateFormat("HH:mm:ss");
-		Main.map.mapView.addMouseListener(this);
+    private List<WayPoint> gpsTrack;
+    private ImageIcon layerIcon;
+    private DateFormat gpsTimeFormat;
+    private WayPoint iconPosition;
+    private final int GPS_INTERVALL=1000;
+    private GPSVideoPlayer gpsVideoPlayer;
+    private boolean autoCenter;
+
+    public VideoPositionLayer(GpxLayer gpsLayer) {
+        super("videolayer");
+        layerIcon = new ImageIcon("images/videomapping.png");
+        gpsTrack=importGPSLayer(gpsLayer.data);
+        gpsTimeFormat= new SimpleDateFormat("HH:mm:ss");
+        Main.map.mapView.addMouseListener(this);
         Main.map.mapView.addMouseMotionListener(this);
         iconPosition=gpsTrack.get(0);
         Main.main.addLayer(this);        
-		
-	}
-
-	//make a flat copy
-	private List<WayPoint> importGPSLayer(GpxData gps) {
-		LinkedList<WayPoint> ls = new LinkedList<WayPoint>();
+    }
+
+    //make a flat copy
+    private List<WayPoint> importGPSLayer(GpxData gps) {
+        LinkedList<WayPoint> ls = new LinkedList<WayPoint>();
         for (GpxTrack trk : gps.tracks) {
             for (GpxTrackSegment segment : trk.getSegments()) {
@@ -69,115 +67,113 @@
         Collections.sort(ls); //sort basing upon time
         return ls;
-	}
-
-	@Override
-	public void paint(Graphics2D g, MapView map, Bounds bound) {
-		paintGpsTrack(g, map);
-		paintSyncedTrack(g, map);
-		paintPositionIcon(g, map);
-		//paintInterpolatedSegment(g); //just a test for my own
-	}
-
-	private void paintGpsTrack(Graphics2D g, MapView map) {
-		g.setColor(Color.YELLOW);
+    }
+
+    @Override
+    public void paint(Graphics2D g, MapView map, Bounds bound) {
+        paintGpsTrack(g, map);
+        paintSyncedTrack(g, map);
+        paintPositionIcon(g, map);
+        //paintInterpolatedSegment(g); //just a test for my own
+    }
+
+    private void paintGpsTrack(Graphics2D g, MapView map) {
+        g.setColor(Color.YELLOW);
         for(WayPoint n: gpsTrack) {
             Point p = map.getPoint(n.getEastNorth());
             g.drawOval(p.x - 2, p.y - 2, 4, 4);
         }
-	}
-	
-	private void paintSyncedTrack(Graphics2D g, MapView map) {
-		g.setColor(Color.GREEN);
-		for (WayPoint n : gpsTrack) {
-			if (n.attr.containsKey("synced"))
-			{
-				Point p = map.getPoint(n.getEastNorth());
-	            g.drawOval(p.x - 2, p.y - 2, 4, 4);
-			}				
-		} 
-		
-	}
-
-	private void paintPositionIcon(Graphics2D g, MapView map) {
-		Point p=map.getPoint(iconPosition.getEastNorth());
-        layerIcon.paintIcon(null, g, p.x-layerIcon.getIconWidth()/2, p.y-layerIcon.getIconHeight()/2);
-        g.drawString(gpsTimeFormat.format(iconPosition.getTime()),p.x-15,p.y-15);
-	}
-/*	
-	private void paintInterpolatedSegment(Graphics2D g) {
-		g.setColor(Color.CYAN);
-		List<WayPoint>ls=getInterpolatedSegment(iconPosition,5,5);
+    }
+    
+    private void paintSyncedTrack(Graphics2D g, MapView map) {
+        g.setColor(Color.GREEN);
+        for (WayPoint n : gpsTrack) {
+            if (n.attr.containsKey("synced")) {
+                Point p = map.getPoint(n.getEastNorth());
+                g.drawOval(p.x - 2, p.y - 2, 4, 4);
+            }                
+        } 
+    }
+
+    private void paintPositionIcon(Graphics2D g, MapView map) {
+        if (iconPosition != null) {
+            Point p = map.getPoint(iconPosition.getEastNorth());
+            layerIcon.paintIcon(null, g, p.x-layerIcon.getIconWidth()/2, p.y-layerIcon.getIconHeight()/2);
+            g.drawString(gpsTimeFormat.format(iconPosition.getTime()),p.x-15,p.y-15);
+        }
+    }
+/*    
+    private void paintInterpolatedSegment(Graphics2D g) {
+        g.setColor(Color.CYAN);
+        List<WayPoint>ls=getInterpolatedSegment(iconPosition,5,5);
         for(WayPoint n: ls) {
             Point p = Main.map.mapView.getPoint(n.getEastNorth());
             g.drawOval(p.x - 2, p.y - 2, 4, 4);
         }
-		
-	}
-
-	//just a Demo to show up IPO on a whole segment
-	private List<WayPoint> getInterpolatedSegment(WayPoint center, int before, int after) {
-		LinkedList<WayPoint> ls = new LinkedList<WayPoint>();
-		if(gpsTrack.indexOf(iconPosition)!=0)
-		{
-			WayPoint prev=gpsTrack.get(gpsTrack.indexOf(iconPosition)-1);
-			for(int i=1;i<=before;i++)
-			{
-				ls.add(interpolate(prev,(float)100f/before*i));
-			}
-		}
-		for(int i=1;i<=after;i++)
-		{
-			ls.add(interpolate(iconPosition,(float)100f/before*i));
-		}
-		//test code
-		Date test=getFirstWayPoint().getTime();
-		test.setHours(14);
-		test.setMinutes(50);
-		test.setSeconds(33);		
-		ls.add(getWayPointBefore(new Date(test.getTime()+500)));
-		ls.add(interpolate(new Date(test.getTime()+500)));
-		return ls;
-	}
-*/	
-	//creates a waypoint for the corresponding time
-	public WayPoint interpolate(Date GPSTime)
-	{
-		WayPoint before =getWayPointBefore(GPSTime);
-		long diff=GPSTime.getTime()-before.getTime().getTime();
-		assert diff>=0;
-		assert diff<GPS_INTERVALL;
-		float perc=((float)diff/(float)GPS_INTERVALL)*100;		
-		return interpolate(before,perc);
-	}
-	
-	public WayPoint getWayPointBefore(Date GPSTime)
-	{
-		assert GPSTime.after(getFirstWayPoint().getTime())==true;
-		assert GPSTime.before(getLastWayPoint().getTime())==true;
-		
-		Date first=getFirstWayPoint().getTime();
-		long diff=GPSTime.getTime()-first.getTime();
-		//assumes that GPS intervall is constant
-		int id=(int) (diff/GPS_INTERVALL);		
-		return gpsTrack.get(id);
-	}
-	
-	public WayPoint getFirstWayPoint()
-	{
-		return gpsTrack.get(0);
-	}
-	
-	public WayPoint getLastWayPoint()
-	{
-		return gpsTrack.get(gpsTrack.size()-1);
-	}
-
-	//interpolates a waypoint between this and the following waypoint at percent
-	private WayPoint interpolate(WayPoint first, float percent) {
-		assert (percent>0);
-		assert (percent<100);
-		double dX,dY;
+        
+    }
+
+    //just a Demo to show up IPO on a whole segment
+    private List<WayPoint> getInterpolatedSegment(WayPoint center, int before, int after) {
+        LinkedList<WayPoint> ls = new LinkedList<WayPoint>();
+        if(gpsTrack.indexOf(iconPosition)!=0)
+        {
+            WayPoint prev=gpsTrack.get(gpsTrack.indexOf(iconPosition)-1);
+            for(int i=1;i<=before;i++)
+            {
+                ls.add(interpolate(prev,(float)100f/before*i));
+            }
+        }
+        for(int i=1;i<=after;i++)
+        {
+            ls.add(interpolate(iconPosition,(float)100f/before*i));
+        }
+        //test code
+        Date test=getFirstWayPoint().getTime();
+        test.setHours(14);
+        test.setMinutes(50);
+        test.setSeconds(33);        
+        ls.add(getWayPointBefore(new Date(test.getTime()+500)));
+        ls.add(interpolate(new Date(test.getTime()+500)));
+        return ls;
+    }
+*/    
+    //creates a waypoint for the corresponding time
+    public WayPoint interpolate(Date GPSTime) {
+        WayPoint before = getWayPointBefore(GPSTime);
+        if (before == null) {
+            return null;
+        }
+        long diff = GPSTime.getTime() - before.getTime().getTime();
+        assert diff>=0;
+        assert diff<GPS_INTERVALL;
+        float perc=((float)diff/(float)GPS_INTERVALL)*100;        
+        return interpolate(before,perc);
+    }
+    
+    public WayPoint getWayPointBefore(Date GPSTime) {
+        assert GPSTime.after(getFirstWayPoint().getTime())==true;
+        assert GPSTime.before(getLastWayPoint().getTime())==true;
+        
+        Date first=getFirstWayPoint().getTime();
+        long diff=GPSTime.getTime()-first.getTime();
+        //assumes that GPS intervall is constant
+        int id = (int) (diff/GPS_INTERVALL);        
+        return 0 <= id && id < gpsTrack.size() ? gpsTrack.get(id) : null;
+    }
+    
+    public WayPoint getFirstWayPoint() {
+        return gpsTrack.isEmpty() ? null : gpsTrack.get(0);
+    }
+    
+    public WayPoint getLastWayPoint() {
+        return gpsTrack.isEmpty() ? null : gpsTrack.get(gpsTrack.size()-1);
+    }
+
+    //interpolates a waypoint between this and the following waypoint at percent
+    private WayPoint interpolate(WayPoint first, float percent) {
+        assert (percent>0);
+        assert (percent<100);
+        double dX,dY;
         WayPoint leftP,rightP;
-        
         
         WayPoint next=gpsTrack.get(gpsTrack.indexOf(first)+1);       
@@ -190,106 +186,87 @@
         dY=(rightP.getCoor().lat()-leftP.getCoor().lat())*percent;
         //move in the right direction
-        if (first==leftP)
-        {
-        	return new WayPoint(new LatLon(leftP.getCoor().lat()+dY,leftP.getCoor().lon()+dX));
-        }
-        else
-        	 return new WayPoint(new LatLon(rightP.getCoor().lat()-dY,rightP.getCoor().lon()-dX));
-
-        
-	}
-	
-	private WayPoint getLeftPoint(WayPoint p1,WayPoint p2)
-    {
+        if (first==leftP) {
+            return new WayPoint(new LatLon(leftP.getCoor().lat()+dY,leftP.getCoor().lon()+dX));
+        } else {
+            return new WayPoint(new LatLon(rightP.getCoor().lat()-dY,rightP.getCoor().lon()-dX));
+        }
+    }
+    
+    private WayPoint getLeftPoint(WayPoint p1,WayPoint p2) {
         if(p1.getCoor().lon()<p2.getCoor().lon()) return p1; else return p2;
     }
     
-    private WayPoint getRightPoint(WayPoint p1, WayPoint p2)
-    {
+    private WayPoint getRightPoint(WayPoint p1, WayPoint p2) {
         if(p1.getCoor().lon()>p2.getCoor().lon()) return p1; else return p2;
     }
     
-    public Date getGPSDate()
-    {
-    	return iconPosition.getTime();
-    }
-    
-    public WayPoint getCurrentWayPoint()
-    {
-    	return iconPosition;
-    }
-
-
-
-	public List<WayPoint> getTrack() {
-		return gpsTrack;
-		
-	}
-	
-	public void jump(Date GPSTime)
-	{
-		setIconPosition(getWayPointBefore(GPSTime));
-		
-	}
-
-	public void setIconPosition(WayPoint wp) {
-		iconPosition=wp;
-		Main.map.mapView.repaint();
-		if (autoCenter)
-			Main.map.mapView.zoomTo(iconPosition.getCoor());
-		
-	}
-
-	public void mouseReleased(MouseEvent e) {
-		//only leftclicks on our layer
+    public Date getGPSDate() {
+        return iconPosition.getTime();
+    }
+    
+    public WayPoint getCurrentWayPoint() {
+        return iconPosition;
+    }
+
+    public List<WayPoint> getTrack() {
+        return gpsTrack;
+    }
+    
+    public void jump(Date GPSTime) {
+        setIconPosition(getWayPointBefore(GPSTime));
+    }
+
+    public void setIconPosition(WayPoint wp) {
+        iconPosition = wp;
+        if (Main.isDisplayingMapView()) {
+            Main.map.mapView.repaint();
+            if (autoCenter)
+                Main.map.mapView.zoomTo(iconPosition.getCoor());
+        }
+    }
+
+    public void mouseReleased(MouseEvent e) {
+        //only leftclicks on our layer
         if(e.getButton() == MouseEvent.BUTTON1) {
-        	WayPoint wp = getNearestWayPoint(e.getPoint());            	
-            if(wp!=null)
-            {
-            	if (gpsVideoPlayer.areAllVideosSynced())
-            	{
-            		//we set the video to corresponding position
-            		gpsVideoPlayer.jumpTo(wp.getTime());
-            	}
-            	setIconPosition(wp);
+            WayPoint wp = getNearestWayPoint(e.getPoint());                
+            if (wp != null) {
+                if (gpsVideoPlayer.areAllVideosSynced()) {
+                    //we set the video to corresponding position
+                    gpsVideoPlayer.jumpTo(wp.getTime());
+                }
+                setIconPosition(wp);
             }            
         }
-		
-	}
-
-	//finds the first waypoint that is nearby the given point
-    private WayPoint getNearestWayPoint(Point mouse)
-    {
+    }
+
+    //finds the first waypoint that is nearby the given point
+    private WayPoint getNearestWayPoint(Point mouse) {
         final int MAX=10;
         Point p;
         Rectangle rect = new Rectangle(mouse.x-MAX/2,mouse.y-MAX/2,MAX,MAX);
         //iterate through all possible notes
-        for(WayPoint n : gpsTrack)
-        {
+        for(WayPoint n : gpsTrack) {
             p = Main.map.mapView.getPoint(n.getEastNorth());
-            if (rect.contains(p))
-            {               
+            if (rect.contains(p)) {
                 return n;
             }
-            
         }
         return null;
-        
-    }
-
-	@Override
-	public Icon getIcon() {
-		return layerIcon;
-	}
-
-	@Override
-	public Object getInfoComponent() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public Action[] getMenuEntries() {
-		return new Action[]{
+    }
+
+    @Override
+    public Icon getIcon() {
+        return layerIcon;
+    }
+
+    @Override
+    public Object getInfoComponent() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Action[] getMenuEntries() {
+        return new Action[]{
                 LayerListDialog.getInstance().createActivateLayerAction(this),
                 LayerListDialog.getInstance().createShowHideLayerAction(),
@@ -297,70 +274,52 @@
                 SeparatorLayerAction.INSTANCE,
                 new LayerListPopup.InfoAction(this)};
-	}
-
-
-	@Override
-	public String getToolTipText() {
-		return tr("Shows current position in the video");
-	}
-
-	@Override
-	public boolean isMergable(Layer arg0) {		
-		return false;
-	}
-
-	@Override
-	public void mergeFrom(Layer arg0) {
-		
-	}
-
-	@Override
-	public void visitBoundingBox(BoundingXYVisitor arg0) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void mouseClicked(MouseEvent arg0) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void mouseEntered(MouseEvent arg0) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void mouseExited(MouseEvent arg0) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void mousePressed(MouseEvent e) {
-	}
-
-	public void mouseDragged(MouseEvent arg0) {
-		// TODO Auto-generated method stub
-		
-	}
-
-	public void mouseMoved(MouseEvent arg0) {
-		// TODO Auto-generated method stub
-		
-	}
-	
-	public void setGPSVideoPlayer(GPSVideoPlayer player)
-	{
-		gpsVideoPlayer=player;
-	}
-
-	public void setAutoCenter(boolean enabled) {
-		autoCenter=enabled;
-		
-	}
-
-	public void unload() {
-		Main.main.removeLayer(this);
-		
-	}
-    
+    }
+
+    @Override
+    public String getToolTipText() {
+        return tr("Shows current position in the video");
+    }
+
+    @Override
+    public boolean isMergable(Layer arg0) {        
+        return false;
+    }
+
+    @Override
+    public void mergeFrom(Layer arg0) {
+    }
+
+    @Override
+    public void visitBoundingBox(BoundingXYVisitor arg0) {
+    }
+
+    public void mouseClicked(MouseEvent arg0) {
+    }
+
+    public void mouseEntered(MouseEvent arg0) {
+    }
+
+    public void mouseExited(MouseEvent arg0) {
+    }
+
+    public void mousePressed(MouseEvent e) {
+    }
+
+    public void mouseDragged(MouseEvent arg0) {
+    }
+
+    public void mouseMoved(MouseEvent arg0) {
+    }
+    
+    public void setGPSVideoPlayer(GPSVideoPlayer player) {
+        gpsVideoPlayer = player;
+    }
+
+    public void setAutoCenter(boolean enabled) {
+        autoCenter = enabled;
+    }
+
+    public void unload() {
+        Main.main.removeLayer(this);
+    }
 }
Index: /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideo.java
===================================================================
--- /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideo.java	(revision 30638)
+++ /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideo.java	(revision 30639)
@@ -13,5 +13,5 @@
 
 // a specific synced video
-public class GPSVideo extends Video{
+public class GPSVideo extends Video {
 	private static final String SYNC_KEY = "synced";
 	public JComponent SyncComponent;
@@ -28,6 +28,5 @@
 	}
 	
-	public GPSVideo(Video video)
-	{
+	public GPSVideo(Video video) {
 		super(video.filename, video.id, video.mediaPlayerFactory);
 		this.player = video.player;
@@ -36,14 +35,19 @@
 	//calculates attributes basing upon the current position
 	public void doSync(VideoPositionLayer layer) {
-		this.videoPositionLayer=layer;
+		this.videoPositionLayer = layer;
 		if (isSynced())
 			removeSyncedWayPoints();
-		syncWayPoint=layer.getCurrentWayPoint();
-		syncVideoTime=getCurrentTime();
+		syncWayPoint = layer.getCurrentWayPoint();
+		syncVideoTime = getCurrentTime();
 		//calc now, to avoid calculations on every click
-		start=new Date(syncWayPoint.getTime().getTime()-syncVideoTime);
-		end=new Date(start.getTime()+player.getLength());
-		firstWayPoint=getFirstGPS();
-		lastWayPoint=getLastGPS();
+		if (syncWayPoint != null) {
+    		start = new Date(syncWayPoint.getTime().getTime()-syncVideoTime);
+    		end = new Date(start.getTime()+player.getLength());
+		} else {
+		    start = null;
+		    end = null;
+		}
+		firstWayPoint = getFirstGPS();
+		lastWayPoint = getLastGPS();
 		markSyncedWayPoints();
 		Main.map.mapView.repaint();
@@ -52,10 +56,7 @@
 	//make sure we don't leave the GPS track
 	private WayPoint getFirstGPS() {
-		if(start.before(videoPositionLayer.getFirstWayPoint().getTime()))
-		{
+		if (start == null || start.before(videoPositionLayer.getFirstWayPoint().getTime())) {
 			return videoPositionLayer.getFirstWayPoint();
-		}
-		else
-		{
+		} else {
 			return videoPositionLayer.getWayPointBefore(start);
 		}
@@ -63,11 +64,8 @@
 	
 	//make sure we don't leave the GPS track
-	private WayPoint getLastGPS() {		
-		if(end.after(videoPositionLayer.getLastWayPoint().getTime()))
-		{
+	private WayPoint getLastGPS() {
+		if (end == null || end.after(videoPositionLayer.getLastWayPoint().getTime())) {
 			return videoPositionLayer.getLastWayPoint();
-		}
-		else
-		{
+		} else {
 			return videoPositionLayer.getWayPointBefore(end);
 		}
@@ -75,32 +73,33 @@
 	
 	private void removeSyncedWayPoints() {
-		List <WayPoint> track =videoPositionLayer.getTrack();
-		int start=track.indexOf(firstWayPoint);
-		int end=track.indexOf(lastWayPoint);
-		List <WayPoint> ls =videoPositionLayer.getTrack().subList(start, end);
-		for (WayPoint n : ls) {
-			n.attr.keySet().remove(SYNC_KEY);
-		}				
+		List <WayPoint> track = videoPositionLayer.getTrack();
+		int start = track.indexOf(firstWayPoint);
+		int end = track.indexOf(lastWayPoint);
+        if (0 <= start && start <= end && end < track.size()) {
+    		for (WayPoint n : track.subList(start, end)) {
+    			n.attr.keySet().remove(SYNC_KEY);
+    		}
+        }
 	}
 
 	private void markSyncedWayPoints() {
-		List <WayPoint> track =videoPositionLayer.getTrack();
-		int start=track.indexOf(firstWayPoint);
-		int end=track.indexOf(lastWayPoint);
-		List <WayPoint> ls =videoPositionLayer.getTrack().subList(start, end);
-		for (WayPoint n : ls) {
-			n.attr.put(SYNC_KEY, id);
-		}				
+		List <WayPoint> track = videoPositionLayer.getTrack();
+		int start = track.indexOf(firstWayPoint);
+		int end = track.indexOf(lastWayPoint);
+		if (0 <= start && start <= end && end < track.size()) {
+    		for (WayPoint n : track.subList(start, end)) {
+    			n.attr.put(SYNC_KEY, id);
+    		}
+		}
 	}
 
 	public boolean isSynced() {
-		return firstWayPoint!=null;
+		return syncWayPoint != null;
 	}
 
 	//if synced jump in video to this GPS timecode 
 	public void jumpTo(Date GPSTime) {
-		if((GPSTime.after(firstWayPoint.getTime())&(GPSTime.before(lastWayPoint.getTime()))))
-		{
-			long diff=GPSTime.getTime()-start.getTime();
+		if((GPSTime.after(firstWayPoint.getTime())&(GPSTime.before(lastWayPoint.getTime())))) {
+			long diff = GPSTime.getTime()-start.getTime();
 			player.setTime(diff);
 			System.out.println(diff);
@@ -108,14 +107,11 @@
 	}
 	
-	public WayPoint getCurrentWayPoint()
-	{
-		if (isSynced())
-		{
-			long videotime=player.getTime();
-			Date gpstime=new Date(start.getTime()+videotime);
+	public WayPoint getCurrentWayPoint() {
+		if (isSynced()) {
+			long videotime = player.getTime();
+			Date gpstime = new Date(start.getTime()+videotime);
 			return videoPositionLayer.interpolate(gpstime);
 		}
 		return null;
 	}
-
 }
Index: /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideoPlayer.java
===================================================================
--- /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideoPlayer.java	(revision 30638)
+++ /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideoPlayer.java	(revision 30639)
@@ -18,6 +18,5 @@
 
 //extends video playback, major control has the video player
-public class GPSVideoPlayer extends VideoPlayer
-{
+public class GPSVideoPlayer extends VideoPlayer {
 	private List<GPSVideo> videos;
 	private VideoPositionLayer videoPositionLayer;
@@ -69,6 +68,5 @@
 	
 	//jump in all videos this date, if possible
-	public void jumpTo(Date date)
-	{
+	public void jumpTo(Date date) {
 		for (GPSVideo video : videos) {
 			video.jumpTo(date);
@@ -76,6 +74,5 @@
 	}
 	
-	public boolean areAllVideosSynced()
-	{
+	public boolean areAllVideosSynced() {
 		for (GPSVideo video : videos) {
 			if (!video.isSynced()) return false;
@@ -83,5 +80,4 @@
 		return true;		
 	}
-
 
 	@Override
@@ -97,15 +93,3 @@
 		super.windowClosing(arg0);
 	}
-	
-	
-	
-	
-    
-    
-
-
-    
-    
-
-    
 }
Index: /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideoPlayer.java
===================================================================
--- /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideoPlayer.java	(revision 30638)
+++ /applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideoPlayer.java	(revision 30639)
@@ -28,4 +28,6 @@
 import javax.swing.event.ChangeListener;
 
+import org.openstreetmap.josm.gui.util.GuiHelper;
+
 import uk.co.caprica.vlcj.player.DeinterlaceMode;
 
@@ -33,6 +35,6 @@
  */
 public class VideoPlayer extends JFrame implements WindowListener, VideosObserver, VideoPlayerObserver {
-	private static final int notificationIntervall = 500;
-	protected JPanel screenPanel,controlsPanel,canvasPanel;
+    private static final int notificationIntervall = 500;
+    protected JPanel screenPanel,controlsPanel,canvasPanel;
     private JSlider timeline;
     private JButton play,back,forward;
@@ -43,98 +45,89 @@
     private long jumpLength;
     private long loopLength;
-	private Timer loopingTimer;
-	private boolean isManualJump;
-	private Timer notificationTimer;
-	private List<VideoPlayerObserver> observers;
-	
-	public VideoPlayer(DateFormat videoTimeFormat) throws HeadlessException {
-		super();		
-//		this.videoTimeFormat=videoTimeFormat;
-		//setup playback notifications
-		videoengine=new VideoEngine(this);
-		videoengine.addObserver(this);
-		observers=new LinkedList<VideoPlayerObserver>();		
-		addObserver(this);
-		//setup GUI
-	    setSize(400, 300); //later we apply movie size
-	    setAlwaysOnTop(true);
-	    createUI();
-	    addUI();
-	    addUIListeners();    
-	    setVisible(true);
-	    setAlwaysOnTop(true);	    
-	    this.addWindowListener(this);
-	}
-	
-	public Video addVideo(File videofile, String id) {
-		Video video = new Video(videofile,id,videoengine.mediaPlayerFactory);
-		canvasPanel.add(video.panel);
-		video.canvas.setSize(new Dimension(300, 300)); // will be updated by the video engine itself
-		videoengine.add(video);
+    private Timer loopingTimer;
+    private boolean isManualJump;
+    private Timer notificationTimer;
+    private List<VideoPlayerObserver> observers;
+    
+    public VideoPlayer(DateFormat videoTimeFormat) throws HeadlessException {
+        super();        
+//        this.videoTimeFormat=videoTimeFormat;
+        //setup playback notifications
+        videoengine=new VideoEngine(this);
+        videoengine.addObserver(this);
+        observers=new LinkedList<VideoPlayerObserver>();        
+        addObserver(this);
+        //setup GUI
+        setSize(400, 300); //later we apply movie size
+        setAlwaysOnTop(true);
+        createUI();
+        addUI();
+        addUIListeners();    
+        setVisible(true);
+        setAlwaysOnTop(true);        
+        this.addWindowListener(this);
+    }
+    
+    public Video addVideo(File videofile, String id) {
+        Video video = new Video(videofile,id,videoengine.mediaPlayerFactory);
+        canvasPanel.add(video.panel);
+        video.canvas.setSize(new Dimension(300, 300)); // will be updated by the video engine itself
+        videoengine.add(video);
         pack();
         startNotificationTimer();
         return video;
-	}
-	
-	public List <Video> getVideos()
-	{
-		return videoengine.getVideos();
-	}
-
-	
-	public void pause() {
-		videoengine.pause();
-		if (videoengine.isNoVideoPlaying())
-			stopNotificationTimer();
-		else
-			startNotificationTimer();
-	}
-	
-	public void pauseAll()
-	{
-		stopNotificationTimer();
-		videoengine.pauseAll();
-	}
-
-	public void backward() {
-		videoengine.jumpFor(-jumpLength);	
-	}
-
-	public void forward() {
-		videoengine.jumpFor(jumpLength);	
-	}
-
-	public void setSpeed(Integer percent)
-	{
-		speed.setValue(percent);		
-	}
-	
-	public Integer getSpeed()
-	{
-		return speed.getValue();
-	}
-	
-	public void setDeinterlacer(DeinterlaceMode deinterlacer)
-	{
-		videoengine.setDeinterlacer(deinterlacer);
-	}
-	
-	public void setSubtitles(boolean enabled)
-	{
-		videoengine.setSubtitles(enabled);
-	}
-
-	public void mute()
-	{
-		videoengine.mute();
-	}
-
-	//TODO auf mehrere Videos umstellen
-	public void toggleLooping() {
-		if(loopingTimer==null)
-		{
-			//do reset after loop time experienced
-			final long videoResetTime=(long) videoengine.getVideoTime()-loopLength/2;
-			TimerTask reset=new TimerTask() {                
+    }
+    
+    public List <Video> getVideos() {
+        return videoengine.getVideos();
+    }
+    
+    public void pause() {
+        videoengine.pause();
+        if (videoengine.isNoVideoPlaying())
+            stopNotificationTimer();
+        else
+            startNotificationTimer();
+    }
+    
+    public void pauseAll() {
+        stopNotificationTimer();
+        videoengine.pauseAll();
+    }
+
+    public void backward() {
+        videoengine.jumpFor(-jumpLength);    
+    }
+
+    public void forward() {
+        videoengine.jumpFor(jumpLength);    
+    }
+
+    public void setSpeed(Integer percent) {
+        speed.setValue(percent);        
+    }
+    
+    public Integer getSpeed() {
+        return speed.getValue();
+    }
+    
+    public void setDeinterlacer(DeinterlaceMode deinterlacer) {
+        videoengine.setDeinterlacer(deinterlacer);
+    }
+    
+    public void setSubtitles(boolean enabled) {
+        videoengine.setSubtitles(enabled);
+    }
+
+    public void mute() {
+        videoengine.mute();
+    }
+
+    //TODO auf mehrere Videos umstellen
+    public void toggleLooping() {
+        if (loopingTimer==null) {
+            //do reset after loop time experienced
+            final long videoResetTime = (long) videoengine.getVideoTime()-loopLength/2;
+            TimerTask reset = new TimerTask() {                
                 @Override
                 public void run() {
@@ -144,15 +137,12 @@
             loopingTimer= new Timer();
             loopingTimer.schedule(reset,loopLength/2,loopLength);
+        } else {
+            loopingTimer.cancel();
+            loopingTimer=null;
         }
-		else
-		{
-			loopingTimer.cancel();
-			loopingTimer=null;
-		}
-		
-	}
-
-	//create all normal player controls
-	private void createUI() {
+    }
+
+    //create all normal player controls
+    private void createUI() {
         //setIconImage();
         timeline = new JSlider(0,100,0);
@@ -176,8 +166,8 @@
         speed.setPaintLabels(true);
     }
-	
-	//puts all player controls to screen
-	private void addUI() {
-		//create layouts
+    
+    //puts all player controls to screen
+    private void addUI() {
+        //create layouts
         this.setLayout(new BorderLayout());
         screenPanel=new JPanel();
@@ -201,17 +191,18 @@
         mute.setSelected(false);
     }
-	
-	//add UI functionality
+    
+    //add UI functionality
     private void addUIListeners() {        
         
         play.addActionListener(new ActionListener() {            
-            @Override public void actionPerformed(ActionEvent arg0) {
-            pause();                
+            @Override
+            public void actionPerformed(ActionEvent arg0) {
+                pause();                
             }
         });
         
         back.addActionListener(new ActionListener() {
-            
-            @Override public void actionPerformed(ActionEvent arg0) {
+            @Override
+            public void actionPerformed(ActionEvent arg0) {
                 backward();
             }
@@ -219,6 +210,6 @@
         
         forward.addActionListener(new ActionListener() {
-            
-            @Override public void actionPerformed(ActionEvent arg0) {
+            @Override
+            public void actionPerformed(ActionEvent arg0) {
                 forward();
             }
@@ -226,6 +217,6 @@
         
         loop.addActionListener(new ActionListener() {
-
-            @Override public void actionPerformed(ActionEvent arg0) {
+            @Override
+            public void actionPerformed(ActionEvent arg0) {
                 toggleLooping();
             }
@@ -233,6 +224,6 @@
         
         mute.addActionListener(new ActionListener() {
-
-            @Override public void actionPerformed(ActionEvent arg0) {
+            @Override
+            public void actionPerformed(ActionEvent arg0) {
                 mute();
             }
@@ -242,132 +233,125 @@
             @Override
             public void stateChanged(ChangeEvent e) {
-        		//skip events, fired by this sliede, one cycle ago            	
-            	if(!isManualJump)
-            	{
-	            	isManualJump=true;
-	            	videoengine.jumpToPosition((timeline.getValue()));
-	            	System.out.println("manual jump");
-            	}
-            }
+                //skip events, fired by this sliede, one cycle ago                
+                if (!isManualJump) {
+                    isManualJump = true;
+                    videoengine.jumpToPosition((timeline.getValue()));
+                }
+            }
+        });
+        
+        speed.addChangeListener(new ChangeListener() {            
+            @Override
+            public void stateChanged(ChangeEvent arg0) {                            
+                if(!speed.getValueIsAdjusting()) {
+                    videoengine.setSpeed(speed.getValue());
+                }
+            }
+        });
+    }
+    
+    public void setJumpLength(long ms) {
+        jumpLength = ms;
+    }
+    
+    public void setLoopLength(long ms) {
+        loopLength = ms;
+    }
+    
+    public void enableSingleVideoMode(boolean enabled) {
+        pauseAll();
+        videoengine.enableSingleVideoMode(enabled);
+    }
+    
+    public void addObserver(VideoPlayerObserver observer) {
+        observers.add(observer);
+    }
+    
+    private void stopNotificationTimer() {
+        /*
+        if(notificationTimer!=null)
+        {
+            notificationTimer.cancel();
+            notificationTimer=null;
+        }
+        */
+    }
+
+    private void startNotificationTimer() {
+        notificationTimer= new Timer();
+        notificationTimer.schedule(new TimerTask() {                
+            @Override
+            public void run() {
+                notifyObservers();
                 
-        });
-        
-        speed.addChangeListener(new ChangeListener() {            
-            @Override
-            public void stateChanged(ChangeEvent arg0) {            	            
-            	if(!speed.getValueIsAdjusting())
-            	{
-            		videoengine.setSpeed(speed.getValue());
-            	}
-            }
-        });
-        
-    }
-    
-    public void setJumpLength(long ms)
-    {
-    	jumpLength=ms;
-    }
-    
-    public void setLoopLength(long ms)
-    {
-    	loopLength=ms;
-    }
-    
-    public void enableSingleVideoMode(boolean enabled)
-    {
-    	pauseAll();
-    	videoengine.enableSingleVideoMode(enabled);
-    }
-    
-    public void addObserver(VideoPlayerObserver observer)
-    {
-    	observers.add(observer);
-    }
-	
-	
-	private void stopNotificationTimer() {
-		/*
-		if(notificationTimer!=null)
-		{
-			notificationTimer.cancel();
-			notificationTimer=null;
-		}
-		*/
-	}
-
-	private void startNotificationTimer() {
-		notificationTimer= new Timer();
-		notificationTimer.schedule(new TimerTask() {				
-			@Override
-			public void run() {
-				notifyObservers();
-				
-			}
-		},notificationIntervall,notificationIntervall);
-	}
-	
-	private void  notifyObservers() {
-		for (VideoPlayerObserver observer : observers) {
-			observer.update_plays();//TODO hier müssten gleich die Zeiten übergeben werden
-		}
-	}
-
-        @Override
-	public void windowActivated(WindowEvent arg0) { }
-
-        @Override
-	public void windowClosed(WindowEvent arg0) { }
-
-        @Override
-	public void windowClosing(WindowEvent arg0) {	
-		videoengine.unload();
-	}
-
-        @Override
-	public void windowDeactivated(WindowEvent arg0) { }
-
-        @Override
-	public void windowDeiconified(WindowEvent arg0) { }
-
-        @Override
-	public void windowIconified(WindowEvent arg0) { }
-
-        @Override
-	public void windowOpened(WindowEvent arg0) { }
-
-        @Override
-	public void update(VideoObserversEvents event) {
-            switch (event)
-            {		
-                case resizing:
-                {
-                    pack();
-                    break;
-                }
-                case speeding:
-                {
-                    speed.setValue(videoengine.getSpeed());
-                    break;
-                }
-                case jumping:
-                {			
-                    break;
-                }
-            }		
-	}
-
-	//keep internal controls up to date during playback
-        @Override
-	public void update_plays() {
-		timeline.setValue(videoengine.getPosition());
-		setTitle(Long.toString(videoengine.getVideoTime()));
-		isManualJump=false;
-		System.out.println("update");
-		
-	}
-    
-	public boolean isCorrectlyInitiliazed() {
-	    return videoengine != null && videoengine.mediaPlayerFactory != null;
-	}
+            }
+        },notificationIntervall,notificationIntervall);
+    }
+    
+    private void  notifyObservers() {
+        for (VideoPlayerObserver observer : observers) {
+            observer.update_plays();//TODO hier müssten gleich die Zeiten übergeben werden
+        }
+    }
+
+    @Override
+    public void windowActivated(WindowEvent arg0) { }
+
+    @Override
+    public void windowClosed(WindowEvent arg0) { }
+
+    @Override
+    public void windowClosing(WindowEvent arg0) {    
+        videoengine.unload();
+    }
+
+    @Override
+    public void windowDeactivated(WindowEvent arg0) { }
+
+    @Override
+    public void windowDeiconified(WindowEvent arg0) { }
+
+    @Override
+    public void windowIconified(WindowEvent arg0) { }
+
+    @Override
+    public void windowOpened(WindowEvent arg0) { }
+
+    @Override
+    public void update(VideoObserversEvents event) {
+        switch (event)
+        {        
+            case resizing:
+            {
+                pack();
+                break;
+            }
+            case speeding:
+            {
+                speed.setValue(videoengine.getSpeed());
+                break;
+            }
+            case jumping:
+            {            
+                break;
+            }
+        }        
+    }
+
+    //keep internal controls up to date during playback
+    @Override
+    public void update_plays() {
+        GuiHelper.runInEDT(new Runnable() {
+            @Override
+            public void run() {
+                timeline.setValue(videoengine.getPosition());
+                setTitle(Long.toString(videoengine.getVideoTime()));
+            }
+        });
+        isManualJump = false;
+    }
+    
+    public boolean isCorrectlyInitiliazed() {
+        return videoengine != null && videoengine.mediaPlayerFactory != null;
+    }
 }
