Index: applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/GpsPlayer.java
===================================================================
--- applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/GpsPlayer.java	(revision 23528)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/GpsPlayer.java	(revision 23529)
@@ -2,5 +2,4 @@
 
 import java.awt.Point;
-import java.io.File;
 import java.sql.Time;
 import java.text.SimpleDateFormat;
@@ -8,8 +7,4 @@
 import java.util.LinkedList;
 import java.util.List;
-import java.util.ListIterator;
-import java.util.Timer;
-import java.util.TimerTask;
-
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.gpx.WayPoint;
@@ -20,6 +15,4 @@
     private WayPoint prev,curr,next;
     private WayPoint start;
-    private Timer t;
-    private TimerTask ani; //for moving trough the list
     private boolean autoCenter;
     
@@ -79,5 +72,5 @@
     
     //select the given waypoint as center
-    public void jump(WayPoint p)
+    public void goTo(WayPoint p)
     {
         if(ls.contains(p))
@@ -98,10 +91,10 @@
     
     //walk k waypoints forward/backward
-    public void jumpRel(int k)
+    public void move(int k)
     {
 
         if ((ls.indexOf(curr)+k>0)&&(ls.indexOf(curr)<ls.size())) //check range
         {
-            jump(ls.get(ls.indexOf(curr)+k));
+            goTo(ls.get(ls.indexOf(curr)+k));
         }
         Main.map.mapView.repaint(); //seperate modell and view logic...
@@ -109,5 +102,5 @@
     
     //select the k-th waypoint
-    public void jump(int k)
+    public void goTo(int k)
     {
         if (k>0)
@@ -115,5 +108,5 @@
             if ((ls.indexOf(curr)+k>0)&&(ls.indexOf(curr)<ls.size())) //check range
             {
-                jump(ls.get(k));
+                goTo(ls.get(k));
             }
             Main.map.mapView.repaint();
@@ -124,7 +117,8 @@
     public void jump(Time GPSAbsTime)
     {
-        jump(getWaypoint(GPSAbsTime.getTime()-start.getTime().getTime())); //TODO replace Time by Date?
-    }
-    
+        goTo(getWaypoint(GPSAbsTime.getTime()-start.getTime().getTime())); //TODO replace Time by Date?
+    }
+    
+    /*
     //go to the position at 
     public void jump(Date GPSDate)
@@ -137,8 +131,8 @@
         m=GPSDate.getMinutes()-start.getTime().getMinutes();
         h=GPSDate.getHours()-start.getTime().getHours();
-        diff=s*1000+m*60*1000+h*60*60*1000; //TODO ugly hack but nothing else works right
-        jump(getWaypoint(diff)); 
-    }
-    
+        diff=s*1000+m*60*1000+h*60*60*1000; //FIXME ugly hack but nothing else works right
+        goTo(getWaypoint(diff)); 
+    }
+    */
     //gets only points on the line of the GPS track (between waypoints) nearby the point m
     private Point getInterpolated(Point m)
@@ -202,5 +196,4 @@
         Point p;
         Point leftP,rightP;
-        Point c = Main.map.mapView.getPoint(getCurr().getEastNorth());
         Point p1 = Main.map.mapView.getPoint(getCurr().getEastNorth());
         Point p2 = getEndpoint();       
@@ -220,8 +213,7 @@
     //gets further infos for a point between two Waypoints
     public WayPoint getInterpolatedWaypoint(Point m)
-    {   int a,b,length,lengthSeg;
+    {   int length,lengthSeg;
         long timeSeg;
         float ratio;
-        Time base;
         Point p2;
         
@@ -272,7 +264,5 @@
     {
         List<WayPoint> ls;
-        Point p2;
         float step;
-        int length;
         
         step=100/(float)interval;
@@ -332,5 +322,5 @@
     }
 
-    //returns time in ms relatie to startpoint
+    //returns time in ms relative to startpoint
     public long getRelativeTime()
     {
@@ -338,4 +328,5 @@
     }
     
+    //returns time in ms relative to startpoint
     public long getRelativeTime(WayPoint p)
     {
@@ -347,5 +338,5 @@
     public void jump(long relTime) {
         int pos = Math.round(relTime/1000);//TODO ugly quick hack   
-        jump(pos);
+        goTo(pos);
         //if (autoCenter) Main.map.mapView.
     }
Index: applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/PlayerObserver.java
===================================================================
--- applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/PlayerObserver.java	(revision 23528)
+++ 	(revision )
@@ -1,9 +1,0 @@
-package org.openstreetmap.josm.plugins.videomapping;
-
-//an Interface for communication for both players
-public interface PlayerObserver {
-    void playing(long time);
-    void jumping(long time);
-    void metadata(long time,boolean subtitles);
-
-}
Index: applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/PositionLayer.java
===================================================================
--- applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/PositionLayer.java	(revision 23528)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/PositionLayer.java	(revision 23529)
@@ -2,32 +2,17 @@
 
 
-import java.sql.Time;
-import java.text.DateFormat;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Iterator;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.ListIterator;
-import java.util.Set;
-import java.util.Timer;
-import java.util.TimerTask;
-
 import java.awt.Color;
-import java.awt.Component;
 import java.awt.Cursor;
-import java.awt.Dimension;
 import java.awt.Graphics2D;
 import java.awt.Point;
 import java.awt.Rectangle;
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
 import java.awt.event.MouseMotionListener;
+import java.io.File;
 
 import javax.swing.*;
@@ -36,44 +21,50 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.InfoAction;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.gpx.GpxData;
+import org.openstreetmap.josm.data.gpx.GpxTrack;
+import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
 import org.openstreetmap.josm.data.gpx.WayPoint;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
+import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.plugins.videomapping.video.GPSVideoPlayer;
-import org.openstreetmap.josm.tools.ImageProvider;
-import org.openstreetmap.josm.tools.Shortcut;
 
 //Basic rendering and GPS layer interaction
 public class PositionLayer extends Layer implements MouseListener,MouseMotionListener {
-    private static Set<PlayerObserver> observers = new HashSet<PlayerObserver>(); //we have to implement our own Observer pattern
     private List<WayPoint> ls;
-    public GpsPlayer player;
+    public GpsPlayer gps;
     private boolean dragIcon=false; //do we move the icon by hand?
     private WayPoint iconPosition;
     private Point mouse;
     private ImageIcon icon;
-    private SimpleDateFormat mins;
-    private SimpleDateFormat ms;
     private SimpleDateFormat gpsTimeCode;
-    private GPSVideoPlayer gps;
-        
-    public PositionLayer(String name, final List<WayPoint> ls) {
-        super(name);
-        this.ls=ls;
-        player= new GpsPlayer(ls);
+    public GPSVideoPlayer gpsVP;
+        
+    public PositionLayer(File video, GpxLayer GpsLayer) {
+        super(video.getName());
+        ls=copyGPSLayer(GpsLayer.data); //TODO This might be outsourced to a seperated track
+        gps= new GpsPlayer(ls);
         icon = new ImageIcon("images/videomapping.png");
-        mins = new SimpleDateFormat("hh:mm:ss:S");
-        ms= new SimpleDateFormat("mm:ss");
         gpsTimeCode= new SimpleDateFormat("hh:mm:ss");
         Main.map.mapView.addMouseListener(this);
         Main.map.mapView.addMouseMotionListener(this);                          
-        
+        gpsVP = new GPSVideoPlayer(video, gps);
+    }
+    
+    //make a flat copy
+    private List<WayPoint> copyGPSLayer(GpxData route)
+    { 
+        ls = new LinkedList<WayPoint>();
+        for (GpxTrack trk : route.tracks) {
+            for (GpxTrackSegment segment : trk.getSegments()) {
+                ls.addAll(segment.getWayPoints());
+            }
+        }
+        Collections.sort(ls); //sort basing upon time
+        return ls;
     }
 
@@ -88,6 +79,6 @@
         String temp;
         String sep=System.getProperty("line.separator");
-        temp=tr("{0} {1}% of GPS track",gps.getVideo().getName(),gps.getCoverage()*10+sep);
-        temp=temp+gps.getNativePlayerInfos();
+        temp=tr("{0} {1}% of GPS track",gpsVP.getVideo().getName(),gpsVP.getCoverage()*10+sep);
+        temp=temp+gpsVP.getNativePlayerInfos();
         return temp;
     }
@@ -149,16 +140,16 @@
         //draw current segment points
         g.setColor(Color.YELLOW);
-        if(player.getPrev()!=null)
-        {
-            p = Main.map.mapView.getPoint(player.getPrev().getEastNorth());
+        if(gps.getPrev()!=null)
+        {
+            p = Main.map.mapView.getPoint(gps.getPrev().getEastNorth());
             g.drawOval(p.x - 2, p.y - 2, 4, 4);
-            Point p2 = Main.map.mapView.getPoint(player.getCurr().getEastNorth());
+            Point p2 = Main.map.mapView.getPoint(gps.getCurr().getEastNorth());
             g.drawLine(p.x, p.y, p2.x, p2.y);
         }
-        if(player.getNext()!=null)
-        {
-            p = Main.map.mapView.getPoint(player.getNext().getEastNorth());
+        if(gps.getNext()!=null)
+        {
+            p = Main.map.mapView.getPoint(gps.getNext().getEastNorth());
             g.drawOval(p.x - 2, p.y - 2, 4, 4);
-            Point p2 = Main.map.mapView.getPoint(player.getCurr().getEastNorth());
+            Point p2 = Main.map.mapView.getPoint(gps.getCurr().getEastNorth());
             g.drawLine(p.x, p.y, p2.x, p2.y);
         }
@@ -166,5 +157,5 @@
         g.setColor(Color.CYAN);
         g.setBackground(Color.CYAN);
-        LinkedList<WayPoint> ipo=(LinkedList<WayPoint>) player.getInterpolatedLine(5);
+        LinkedList<WayPoint> ipo=(LinkedList<WayPoint>) gps.getInterpolatedLine(5);
         for (WayPoint wp : ipo) {
             p=Main.map.mapView.getPoint(wp.getEastNorth());
@@ -186,8 +177,8 @@
         else
         {
-            if (player.getCurr()!=null){
-            p=Main.map.mapView.getPoint(player.getCurr().getEastNorth());
+            if (gps.getCurr()!=null){
+            p=Main.map.mapView.getPoint(gps.getCurr().getEastNorth());
             icon.paintIcon(null, g, p.x-icon.getIconWidth()/2, p.y-icon.getIconHeight()/2);         
-            g.drawString(gpsTimeCode.format(player.getCurr().getTime()),p.x-10,p.y-10);
+            g.drawString(gpsTimeCode.format(gps.getCurr().getTime()),p.x-10,p.y-10);
             }
         }
@@ -217,5 +208,5 @@
     private Rectangle getIconRect()
     {
-        Point p = Main.map.mapView.getPoint(player.getCurr().getEastNorth());
+        Point p = Main.map.mapView.getPoint(gps.getCurr().getEastNorth());
         return new Rectangle(p.x-icon.getIconWidth()/2,p.y-icon.getIconHeight()/2,icon.getIconWidth(),icon.getIconHeight());
     }
@@ -241,5 +232,5 @@
         if(e.getButton() == MouseEvent.BUTTON1) {
             //is it on the cam icon?
-            if (player.getCurr()!=null)
+            if (gps.getCurr()!=null)
             {
                 if (getIconRect().contains(e.getPoint()))
@@ -267,9 +258,9 @@
                 if(wp!=null)
                 {
-                    player.jump(wp);
+                    gps.goTo(wp);
                     //jump if we know position
                     if(wp.attr.containsKey("synced"))
                     {                       
-                        if(gps!=null) notifyObservers(player.getRelativeTime()); //call videoplayers to set right position
+                        if(gpsVP!=null) gpsVP.jumpToGPSTime(gps.getRelativeTime()); //call videoplayers to set right position
                     }
                 }
@@ -286,5 +277,5 @@
             mouse=e.getPoint();
             //restrict to GPS track
-            iconPosition=player.getInterpolatedWaypoint(mouse);
+            iconPosition=gps.getInterpolatedWaypoint(mouse);
 
             Main.map.mapView.repaint();
@@ -294,5 +285,5 @@
     //visualize drag&drop
     public void mouseMoved(MouseEvent e) {      
-        if (player.getCurr()!=null)
+        if (gps.getCurr()!=null)
         {                       
             if (getIconRect().contains(e.getPoint()))
@@ -308,31 +299,12 @@
     }
 
-    public void setGPSPlayer(GPSVideoPlayer player) {
-        this.gps = player;
-        
-    }
-    
-    public static void addObserver(PlayerObserver observer) {
-
-        observers.add(observer);
-
-    }
-
- 
-
-    public static void removeObserver(PlayerObserver observer) {
-
-        observers.remove(observer);
-
-    }
-
-    private static void notifyObservers(long newTime) {
-
-        for (PlayerObserver o : observers) {
-
-            o.jumping(newTime); //TODO has to become just a single procedure?
-
-        }
-
-    }
+	public  void setVideopPlayer(GPSVideoPlayer player) {
+		gpsVP=player;
+		
+	}
+	
+	public GPSVideoPlayer getVideoPlayer()
+	{
+		return gpsVP;
+	}
 }
Index: applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoMappingPlugin.java
===================================================================
--- applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoMappingPlugin.java	(revision 23528)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoMappingPlugin.java	(revision 23529)
@@ -1,18 +1,9 @@
 package org.openstreetmap.josm.plugins.videomapping;
 
-import java.awt.Component;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
-import java.beans.PropertyChangeListener;
-import java.io.File;
-import java.sql.Time;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.Collections;
 import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.swing.Action;
 import javax.swing.JCheckBoxMenuItem;
 import javax.swing.JFileChooser;
@@ -25,13 +16,6 @@
 import org.openstreetmap.josm.plugins.*;
 import org.openstreetmap.josm.plugins.videomapping.video.GPSVideoPlayer;
-import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.data.gpx.GpxData;
-import org.openstreetmap.josm.data.gpx.GpxTrack;
-import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
-import org.openstreetmap.josm.data.gpx.WayPoint;
-import org.openstreetmap.josm.gui.MainMenu;
-import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
@@ -50,6 +34,5 @@
 public class VideoMappingPlugin extends Plugin implements LayerChangeListener{
       private JMenu VMenu,VDeinterlacer;
-      private GpxData GPSTrack;
-      private List<WayPoint> ls;
+      private GpxLayer GpsLayer;
       private JosmAction VAdd,VRemove,VStart,Vbackward,Vforward,VJump,Vfaster,Vslower,Vloop;
       private JRadioButtonMenuItem VIntBob,VIntNone,VIntLinear;
@@ -88,5 +71,5 @@
         {
             VAdd.setEnabled(true);
-            GPSTrack=((GpxLayer) newLayer).data;            
+            GpsLayer=((GpxLayer) newLayer);            
             //TODO append to GPS Layer menu
         }
@@ -124,15 +107,11 @@
                     {
                         saveSettings();
-                        ls=copyGPSLayer(GPSTrack);
                         enableControlMenus(true);
-                        layer = new PositionLayer(fc.getSelectedFile().getName(),ls);
+                        layer = new PositionLayer(fc.getSelectedFile(),GpsLayer);
                         Main.main.addLayer(layer);
-                        player = new GPSVideoPlayer(fc.getSelectedFile(), layer.player);
                         //TODO Check here if we can sync allready now
-                        layer.setGPSPlayer(player);
-                        layer.addObserver(player);
                         VAdd.setEnabled(false);
                         VRemove.setEnabled(true);
-                        player.setSubtitleAction(VSubTitles);
+                        layer.getVideoPlayer().setSubtitleAction(VSubTitles);
                     }
                 }
@@ -161,5 +140,5 @@
             }
         };
-        Vbackward = new JosmAction(tr("Jump To"), "jumpto", tr("jumps to the entered gps time"),null, false) {          
+        VJump= new JosmAction(tr("Jump To"), "jumpto", tr("jumps to the entered gps time"),null, false) {          
             public void actionPerformed(ActionEvent e) {
                 String s =JOptionPane.showInputDialog(tr("please enter GPS timecode"),"10:07:57");
@@ -291,4 +270,5 @@
         VMenu.add(Vslower);
         VMenu.add(Vloop);
+        VMenu.add(VJump);
         VMenu.addSeparator();
         VMenu.add(VCenterIcon);
@@ -351,15 +331,4 @@
     }
     
-    //make a flat copy
-    private List<WayPoint> copyGPSLayer(GpxData route)
-    { 
-        ls = new LinkedList<WayPoint>();
-        for (GpxTrack trk : route.tracks) {
-            for (GpxTrackSegment segment : trk.getSegments()) {
-                ls.addAll(segment.getWayPoints());
-            }
-        }
-        Collections.sort(ls); //sort basing upon time
-        return ls;
-    }
+    
   }
Index: applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoObserver.java
===================================================================
--- applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoObserver.java	(revision 23529)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoObserver.java	(revision 23529)
@@ -0,0 +1,9 @@
+package org.openstreetmap.josm.plugins.videomapping;
+
+//an Interface for communication for both players
+public interface VideoObserver {
+    void playing(long time);
+    void jumping(long time);
+    void metadata(long time,boolean subtitles);
+
+}
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 23528)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideoPlayer.java	(revision 23529)
@@ -1,27 +1,24 @@
 package org.openstreetmap.josm.plugins.videomapping.video;
 import java.awt.Color;
-import java.awt.Component;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.io.File;
 import java.sql.Time;
-import java.util.Date;
 import java.util.List;
 import java.util.Timer;
 import java.util.TimerTask;
 
-import javax.swing.Action;
 import javax.swing.JButton;
 import javax.swing.JCheckBoxMenuItem;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.gpx.WayPoint;
 import org.openstreetmap.josm.plugins.videomapping.GpsPlayer;
-import org.openstreetmap.josm.plugins.videomapping.PlayerObserver;
+import org.openstreetmap.josm.plugins.videomapping.VideoObserver;
 
 //combines video and GPS playback, major control has the video player
-public class GPSVideoPlayer implements PlayerObserver{
+public class GPSVideoPlayer
+{
     Timer t;
-    TimerTask updateGPSTrack;
+    TimerTask updateGPS; //sync GPS position here
     private GpsPlayer gps;
     private SimpleVideoPlayer video;
@@ -60,5 +57,5 @@
         video.addComponent(syncBtn);
         //a observer to communicate
-        SimpleVideoPlayer.addObserver(new PlayerObserver() { //TODO has o become this
+        SimpleVideoPlayer.addObserver(new VideoObserver() { //TODO has o become this
 
             public void playing(long time) {
@@ -147,19 +144,14 @@
     }
     
-    //jumps in video to the corresponding linked time
-    public void jumpToGPSTime(Time GPSTime)
-    {
-        gps.jump(GPSTime);
-    }
-    
-    //jumps in video to the corresponding linked time
+   
+    //jumps in video to the corresponding Video time (external triggered)
     public void jumpToGPSTime(long gpsT)
     {
-        if(!synced)
+       /* if(!synced)
         {
             //when not synced we can just move the icon to the right position           
             gps.jump(new Date(gpsT));
             Main.map.mapView.repaint();
-        }
+        }*/
         video.jump(getVideoTime(gpsT));
     }
@@ -238,10 +230,5 @@
     }
 
-    //when we clicked on the layer, here we update the video position
-    public void jumping(long time) {
-        if(synced) jumpToGPSTime(gps.getRelativeTime());
-        
-    }
-
+    
     public String getNativePlayerInfos() {
         return video.getNativePlayerInfos();
@@ -258,8 +245,4 @@
     }
 
-    public void playing(long time) {
-        // TODO Auto-generated method stub
-        
-    }
 
     public void toggleSubtitles() {
@@ -277,8 +260,4 @@
     }
 
-    public void metadata(long time, boolean subtitles) {
-        // TODO Auto-generated method stub
-        
-    }
 
     
Index: applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/SimpleVideoPlayer.java
===================================================================
--- applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/SimpleVideoPlayer.java	(revision 23528)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/SimpleVideoPlayer.java	(revision 23529)
@@ -16,5 +16,5 @@
 import java.util.Date;
 import java.util.HashSet;
-import java.util.Hashtable;
+import java.util.Hashtable ;
 import java.util.Set;
 import java.util.Timer;
@@ -32,9 +32,10 @@
 import javax.swing.JSlider;
 import javax.swing.JToggleButton;
+import javax.swing.SwingUtilities;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.plugins.videomapping.PlayerObserver;
+import org.openstreetmap.josm.plugins.videomapping.VideoObserver;
 import static org.openstreetmap.josm.tools.I18n.*;
 
@@ -64,5 +65,5 @@
     private int jumpLength=1000;
     private int  loopLength=6000;
-    private static Set<PlayerObserver> observers = new HashSet<PlayerObserver>(); //we have to implement our own Observer pattern
+    private static Set<VideoObserver> observers = new HashSet<VideoObserver>(); //we have to implement our own Observer pattern
     
     public SimpleVideoPlayer() {
@@ -101,5 +102,15 @@
             //create updater
             ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
-            executorService.scheduleAtFixedRate(new Syncer(this), 0L, 1000L, TimeUnit.MILLISECONDS);
+            executorService.scheduleAtFixedRate(new Runnable() {
+				//We have to do syncing in the main thread
+				public void run() {
+					SwingUtilities.invokeLater(new Runnable() {
+				          //here we update
+				        public void run() {
+				            if (isPlaying()) updateTime(); //if the video is seeking we get a mess
+				        }
+				      });
+				}
+			}, 0L, 1000L, TimeUnit.MILLISECONDS);
             //setDefaultCloseOperation(EXIT_ON_CLOSE);
             addWindowListener(this);
@@ -134,5 +145,5 @@
         speed.setPaintTicks(true);          
         speed.setOrientation(Adjustable.VERTICAL);
-        Hashtable labelTable = new Hashtable();
+        Hashtable labelTable = new Hashtable ();
         labelTable.put( new Integer( 0 ), new JLabel("1x") );
         labelTable.put( new Integer( -200 ), new JLabel("-2x") );
@@ -244,5 +255,5 @@
         pack();
         //send out metadatas to all observers
-        for (PlayerObserver o : observers) {
+        for (VideoObserver o : observers) {
             o.metadata(0, hasSubtitles());
         }
@@ -422,5 +433,5 @@
     }
 
-    public static void addObserver(PlayerObserver observer) {
+    public static void addObserver(VideoObserver observer) {
 
             observers.add(observer);
@@ -430,5 +441,5 @@
      
 
-        public static void removeObserver(PlayerObserver observer) {
+        public static void removeObserver(VideoObserver observer) {
 
             observers.remove(observer);
@@ -438,5 +449,5 @@
         private static void notifyObservers(long newTime) {
 
-            for (PlayerObserver o : observers) {
+            for (VideoObserver o : observers) {
                 o.playing(newTime);
             }
