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 21761)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/GpsPlayer.java	(revision 21779)
@@ -91,11 +91,26 @@
 	}
 	
+	//wal k waypoints forward/backward
+	public void jumpRel(int k)
+	{
+
+		if ((ls.indexOf(curr)+k>0)&&(ls.indexOf(curr)<ls.size())) //check range
+		{
+			jump(ls.get(ls.indexOf(curr)+k));
+		}
+		Main.map.mapView.repaint();
+	}
+	
 	//select the k-th waypoint
 	public void jump(int k)
 	{
-		if ((ls.indexOf(curr)+k>0)&&(ls.indexOf(curr)<ls.size()))
-		{
-			jump(ls.get(ls.indexOf(curr)+k)); //FIXME here is a bug
-		}		
+		if (k>0)
+		{
+			if ((ls.indexOf(curr)+k>0)&&(ls.indexOf(curr)<ls.size())) //check range
+			{
+				jump(ls.get(k));
+			}
+			Main.map.mapView.repaint();
+		}
 	}
 	
@@ -294,17 +309,21 @@
 	public long getRelativeTime()
 	{
-		return curr.getTime().getTime()-start.getTime().getTime(); //TODO assumes timeintervall is constant!!!!
+		return getRelativeTime(curr);
+	}
+	
+	public long getRelativeTime(WayPoint p)
+	{
+		return p.getTime().getTime()-start.getTime().getTime(); //TODO assumes timeintervall is constant!!!!
 	}
 
 	//jumps to a specific time
 	public void jump(long relTime) {
-		int pos = (int) (relTime/1000);//TODO ugly quick hack	
-		jump(pos);		
-		
+		int pos = Math.round(relTime/1000);//TODO ugly quick hack	
+		jump(pos);				
 	}
 	
 	//toggles walking along the track
 	public void play()
-	{
+	{ /*
 		if (t==null)
 		{
@@ -329,5 +348,5 @@
 			t.cancel();
 			t=null;					
-		}
+		}*/
 	}
 
@@ -340,4 +359,9 @@
 		this.autoCenter=b;
 	}
+	
+	public List<WayPoint> getTrack()
+	{
+		return ls;
+	}
 
 
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 21761)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/PlayerObserver.java	(revision 21779)
@@ -3,8 +3,6 @@
 //an Interface for communication for both players
 public interface PlayerObserver {
-	void paused();
-	void start_playing();
-	void jumping(long relTime);
-	void changeSpeed(float ratio);
+	void playing(long time);
+	void jumping(long time);
 
 }
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 21761)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/PositionLayer.java	(revision 21779)
@@ -8,8 +8,10 @@
 import java.util.Collection;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.ListIterator;
+import java.util.Set;
 import java.util.Timer;
 import java.util.TimerTask;
@@ -53,4 +55,5 @@
 //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;
@@ -67,6 +70,5 @@
 		this.ls=ls;
 		player= new GpsPlayer(ls);
-
-		icon=ImageProvider.get("videomapping.png");
+		icon = new ImageIcon("images/videomapping.png");
 		mins = new SimpleDateFormat("hh:mm:ss:S");
 		ms= new SimpleDateFormat("mm:ss");
@@ -84,5 +86,9 @@
 	@Override
 	public Object getInfoComponent() {
-		return tr("{0} covers {1}% of GPS track",gps.getVideo().getName(),gps.getCoverage()*10);
+		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();
+		return temp;
 	}
 
@@ -129,6 +135,15 @@
 			p = Main.map.mapView.getPoint(n.getEastNorth());
 			g.drawOval(p.x - 2, p.y - 2, 4, 4);
-			}
-		//draw surrounding points
+		}
+		//draw synced points
+		g.setColor(Color.ORANGE);
+		for(WayPoint n: ls) {
+			if(n.attr.containsKey("synced"))
+			{
+				p = Main.map.mapView.getPoint(n.getEastNorth());
+				g.drawOval(p.x - 2, p.y - 2, 4, 4);
+			}
+		}
+		//draw current segment points
 		g.setColor(Color.YELLOW);
 		if(player.getPrev()!=null)
@@ -176,4 +191,5 @@
 	}
 	
+	//finds the first waypoint that is nearby the given point
 	private WayPoint getNearestWayPoint(Point mouse)
 	{
@@ -182,5 +198,5 @@
 		Rectangle rect = new Rectangle(mouse.x-MAX/2,mouse.y-MAX/2,MAX,MAX);
 		//iterate through all possible notes
-		for(WayPoint n : ls) //TODO this is not very clever, what better way to find this WP?
+		for(WayPoint n : ls) //TODO this is not very clever, what better way to find this WP? Hashmaps? Divide and Conquer?
 		{
 			p = Main.map.mapView.getPoint(n.getEastNorth());
@@ -228,5 +244,4 @@
 					mouse=e.getPoint();
 					dragIcon=true;
-					//ani.cancel();
 				}
 			}
@@ -250,5 +265,5 @@
 				{
 					player.jump(wp);
-					if(gps!=null) gps.notifyGPSClick();
+					if(gps!=null) notifyObservers(player.getRelativeTime()); //call videoplayer to set rigth position
 				}
 			}
@@ -290,3 +305,27 @@
 		
 	}
+	
+	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);
+
+        }
+
+    }
 }
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 21761)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoMappingPlugin.java	(revision 21779)
@@ -38,5 +38,5 @@
 
   /**
- * @author Matthias Meißer
+ * @author Matthias Meißer (digi_c at arcor dot de)
  * @ released under GPL
  * This Plugin allows you to link a video against a GPS track and playback both synchronously 
@@ -48,5 +48,5 @@
 	  private GpxData GPSTrack;
 	  private List<WayPoint> ls;
-	  private JosmAction VAdd,VRemove,VStart,Vbackward,Vforward,Vloop;
+	  private JosmAction VAdd,VRemove,VStart,Vbackward,Vforward,Vfaster,Vslower,Vloop;
 	  private JRadioButtonMenuItem VIntBob,VIntNone,VIntLinear;
 	  private JCheckBoxMenuItem VCenterIcon;
@@ -54,20 +54,31 @@
 	  private GPSVideoPlayer player;
 	  private PositionLayer layer;
+	  private final String VM_DEINTERLACER="videomapping.deinterlacer";
+	  private final String VM_MRU="videomapping.mru";
+	  private final String VM_AUTOCENTER="videomapping.autocenter";
+	  private final String VM_JUMPLENGTH="videomapping.jumplength";
+	  private final String VM_LOOPLENGTH="videomapping.looplength";
+	  private boolean autocenter;
+	  private String deinterlacer;
+	  private Integer jumplength,looplength;
+	  private String mru;
+	  //TODO What more to store during sessions? Size/Position
 	  
 
 	public VideoMappingPlugin(PluginInformation info) {
 		super(info);
+		MapView.addLayerChangeListener(this);
 		//Register for GPS menu
 		VMenu = Main.main.menu.addMenu(" Video", KeyEvent.VK_V, Main.main.menu.defaultMenuPos,ht("/Plugin/Videomapping"));//TODO no more ugly " video" hack
 		addMenuItems();
+		enableControlMenus(true);
 		loadSettings();
-		enableControlMenus(false);
-		//setup
-		MapView.addLayerChangeListener(this);
+		applySettings();		
 		//further plugin informations are provided by build.xml properties
-	}	
+	}
 			
 	//only use with GPS and own layers
 	public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+		System.out.println(newLayer);
 		if (newLayer instanceof GpxLayer)
 		{
@@ -77,5 +88,5 @@
 		}
 		else
-		{
+		{/*
 			VAdd.setEnabled(false);
 			if(newLayer instanceof PositionLayer)
@@ -86,5 +97,5 @@
 			{
 				enableControlMenus(false);
-			}
+			}*/
 		}
 		
@@ -100,22 +111,29 @@
 	//register main controls
 	private void addMenuItems() {
-		VAdd= new JosmAction("Import Video","videomapping","Sync a video against this GPS track",null,false) {
+		VAdd= new JosmAction(tr("Import Video"),"videomapping",tr("Sync a video against this GPS track"),null,false) {
 			private static final long serialVersionUID = 1L;
 
-			public void actionPerformed(ActionEvent arg0) {
-				copyGPSLayer();
-				enableControlMenus(true);
-				layer = new PositionLayer("test",ls);
-				Main.main.addLayer(layer);
-				/*JFileChooser fc = new JFileChooser("Open Video file");
-				fc.getSelectedFile();*/
-				player = new GPSVideoPlayer(new File("C:\\temp\\test.mpg"), layer.player);
-				//TODO Check here if we can sync by hand
-				layer.setGPSPlayer(player);
-				VAdd.setEnabled(false);
-				VRemove.setEnabled(true);				
-			}			
-		};
-		VRemove= new JosmAction("Remove Video","videomapping","Removes current video from Layer",null,false) {
+			public void actionPerformed(ActionEvent arg0) {					
+					JFileChooser fc = new JFileChooser();
+					//fc.setSelectedFile(new File(mru));
+					fc.setSelectedFile(new File("C:\\TEMP"));
+					if(fc.showOpenDialog(Main.main.parent)!=JFileChooser.CANCEL_OPTION)
+					{
+						saveSettings();
+						ls=copyGPSLayer(GPSTrack);
+						enableControlMenus(true);
+						layer = new PositionLayer(fc.getSelectedFile().getName(),ls);
+						Main.main.addLayer(layer);
+						player = new GPSVideoPlayer(fc.getSelectedFile(), layer.player);
+						//TODO Check here if we can sync by hand
+						layer.setGPSPlayer(player);
+						layer.addObserver(player);
+						VAdd.setEnabled(false);
+						VRemove.setEnabled(true);
+					}
+				}
+		
+		};
+		VRemove= new JosmAction(tr("Remove Video"),"videomapping",tr("removes current video from layer"),null,false) {
 			private static final long serialVersionUID = 1L;
 
@@ -124,16 +142,12 @@
 			}
 		};
-		VStart = new JosmAction("play/pause", "audio-playpause", "starts/pauses video playback",
+		VStart = new JosmAction(tr("play/pause"), "audio-playpause", tr("starts/pauses video playback"),
 				Shortcut.registerShortcut("videomapping:startstop","",KeyEvent.VK_SPACE, Shortcut.GROUP_DIRECT), false) {
 			
 			public void actionPerformed(ActionEvent e) {								
-				//video.play();				
-				//video.jump(605000);
-				//layer.l.jump(9*60+20);
-				//layer.pause();
-				player.play((9*60+20)*1000);
-			}
-		};
-		Vbackward = new JosmAction("backward", "audio-prev", "jumps n sec back",
+				if(player.playing()) player.pause(); else player.play();
+			}
+		};
+		Vbackward = new JosmAction(tr("backward"), "audio-prev", tr("jumps n sec back"),
 				Shortcut.registerShortcut("videomapping:backward","",KeyEvent.VK_NUMPAD4, Shortcut.GROUP_DIRECT), false) {
 			
@@ -143,5 +157,5 @@
 			}
 		};
-		Vforward= new JosmAction("forward", "audio-next", "jumps n sec forward",
+		Vforward= new JosmAction(tr("forward"), "audio-next", tr("jumps n sec forward"),
 				Shortcut.registerShortcut("videomapping:forward","",KeyEvent.VK_NUMPAD6, Shortcut.GROUP_DIRECT), false) {
 			
@@ -151,5 +165,21 @@
 			}
 		};
-		Vloop= new JosmAction("loop", "clock", "loops n sec around current position",
+		Vfaster= new JosmAction(tr("faster"), "audio-faster", tr("faster playback"),
+				Shortcut.registerShortcut("videomapping:faster","",KeyEvent.VK_PLUS, Shortcut.GROUP_DIRECT), false) {
+			
+			public void actionPerformed(ActionEvent e) {
+				player.faster();
+							
+			}
+		};
+		Vslower= new JosmAction(tr("slower"), "audio-slower", tr("slower playback"),
+				Shortcut.registerShortcut("videomapping:slower","",KeyEvent.VK_MINUS, Shortcut.GROUP_DIRECT), false) {
+			
+			public void actionPerformed(ActionEvent e) {
+				player.slower();
+							
+			}
+		};
+		Vloop= new JosmAction(tr("loop"), "clock", tr("loops n sec around current position"),
 				Shortcut.registerShortcut("videomapping:loop","",KeyEvent.VK_NUMPAD5, Shortcut.GROUP_DIRECT), false) {
 			
@@ -161,28 +191,33 @@
 		
 		//now the options menu
-		VCenterIcon = new JCheckBoxMenuItem(new JosmAction("Keep centered", null, "Follows the video icon automaticly",null, false) {
-			
-			public void actionPerformed(ActionEvent e) {
-				player.setAutoCenter(VCenterIcon.isSelected()); 
-							
-			}
-		});
-		
-		VJumpLength = new JMenuItem(new JosmAction("Jump length", null, "Set the length of a jump",null, false) {
+		VCenterIcon = new JCheckBoxMenuItem(new JosmAction(tr("Keep centered"), "cursor/crosshair", tr("follows the video icon automaticly"),null, false) {
+			
+			public void actionPerformed(ActionEvent e) {
+				autocenter=VCenterIcon.isSelected();
+				applySettings();
+				saveSettings();
+							
+			}
+		});
+		
+		VJumpLength = new JMenuItem(new JosmAction(tr("Jump length"), null, tr("Set the length of a jump"),null, false) {
 			
 			public void actionPerformed(ActionEvent e) {
 				Object[] possibilities = {"200", "500", "1000", "2000", "10000"};
-				String s = (String)JOptionPane.showInputDialog(Main.parent,"Jump in video for x ms","Jump length",JOptionPane.QUESTION_MESSAGE,null,possibilities,"1000");
-				player.setJumpLength(Integer.getInteger(s));
-							
-			}
-		});
-		
-		VLoopLength = new JMenuItem(new JosmAction("Loop length", null, "Set the length around a looppoint",null, false) {
+				String s = (String)JOptionPane.showInputDialog(Main.parent,tr("Jump in video for x ms"),tr("Jump length"),JOptionPane.QUESTION_MESSAGE,null,possibilities,jumplength);
+				jumplength=Integer.getInteger(s);
+				applySettings();
+				saveSettings();			
+			}
+		});
+		
+		VLoopLength = new JMenuItem(new JosmAction(tr("Loop length"), null, tr("Set the length around a looppoint"),null, false) {
 			
 			public void actionPerformed(ActionEvent e) {
 				Object[] possibilities = {"500", "1000", "3000", "5000", "10000"};
-				String s = (String)JOptionPane.showInputDialog(Main.parent,"Jump in video for x ms","Loop length",JOptionPane.QUESTION_MESSAGE,null,possibilities,"5000");
-				player.setLoopLength(Integer.getInteger(s));
+				String s = (String)JOptionPane.showInputDialog(Main.parent,tr("Jump in video for x ms"),tr("Loop length"),JOptionPane.QUESTION_MESSAGE,null,possibilities,looplength);
+				looplength=Integer.getInteger(s);
+				applySettings();
+				saveSettings();
 							
 			}
@@ -190,20 +225,26 @@
 		
 		VDeinterlacer= new JMenu("Deinterlacer");
-		VIntNone= new JRadioButtonMenuItem(new JosmAction("none", null, "no deinterlacing",null, false) {
-			
-			public void actionPerformed(ActionEvent e) {
-				player.setDeinterlacer(null);
-			}
-		});
-		VIntBob= new JRadioButtonMenuItem(new JosmAction("bob", null, "deinterlacing using line doubling",null, false) {
-			
-			public void actionPerformed(ActionEvent e) {
-				player.setDeinterlacer("bob");
-			}
-		});
-		VIntLinear= new JRadioButtonMenuItem(new JosmAction("linear", null, "deinterlacing using linear interpolation",null, false) {
-			
-			public void actionPerformed(ActionEvent e) {
-				player.setDeinterlacer("bob");
+		VIntNone= new JRadioButtonMenuItem(new JosmAction(tr("none"), null, tr("no deinterlacing"),null, false) {
+			
+			public void actionPerformed(ActionEvent e) {
+				deinterlacer=null;
+				applySettings();
+				saveSettings();
+			}
+		});
+		VIntBob= new JRadioButtonMenuItem(new JosmAction("bob", null, tr("deinterlacing using line doubling"),null, false) {
+			
+			public void actionPerformed(ActionEvent e) {
+				deinterlacer="bob";
+				applySettings();
+				saveSettings();
+			}
+		});
+		VIntLinear= new JRadioButtonMenuItem(new JosmAction("linear", null, tr("deinterlacing using linear interpolation"),null, false) {
+			
+			public void actionPerformed(ActionEvent e) {
+				deinterlacer="linear";
+				applySettings();
+				saveSettings();
 			}
 		});
@@ -216,4 +257,6 @@
 		VMenu.add(Vbackward);
 		VMenu.add(Vforward);
+		VMenu.add(Vfaster);
+		VMenu.add(Vslower);
 		VMenu.add(Vloop);
 		VMenu.addSeparator();
@@ -235,14 +278,49 @@
 	}
 	
-	//load all properties
+	//load all properties or set defaults
 	private void loadSettings() {
+		String temp;		
+		temp=Main.pref.get(VM_AUTOCENTER);
+		if((temp!=null)&&(temp.length()!=0))autocenter=Boolean.getBoolean(temp); else autocenter=false;
+		temp=Main.pref.get(VM_DEINTERLACER);
+		if((temp!=null)&&(temp.length()!=0)) deinterlacer=Main.pref.get(temp);
+		temp=Main.pref.get(VM_JUMPLENGTH);
+		if((temp!=null)&&(temp.length()!=0)) jumplength=Integer.valueOf(temp); else jumplength=1000; 
+		temp=Main.pref.get(VM_LOOPLENGTH);
+		if((temp!=null)&&(temp.length()!=0)) looplength=Integer.valueOf(temp); else looplength=6000;
+		temp=Main.pref.get(VM_MRU);
+		if((temp!=null)&&(temp.length()!=0)) mru=Main.pref.get(VM_MRU);else mru=System.getProperty("user.home");
+	}
+	
+	private void applySettings(){
+		//Internals
+		if(player!=null)
+		{
+			player.setAutoCenter(autocenter);
+			player.setDeinterlacer(deinterlacer);
+			player.setJumpLength(jumplength);
+			player.setLoopLength(looplength);
+		}
+		//GUI
+		VCenterIcon.setSelected(autocenter);
 		VIntNone.setSelected(true);
+		if(deinterlacer=="bob")VIntBob.setSelected(true);
+		if(deinterlacer=="linear")VIntLinear.setSelected(true);
+		
+	}
+	
+	private void saveSettings(){
+		Main.pref.put(VM_AUTOCENTER, autocenter);
+		Main.pref.put(VM_DEINTERLACER, deinterlacer);
+		Main.pref.put(VM_JUMPLENGTH, jumplength.toString());
+		Main.pref.put(VM_LOOPLENGTH, looplength.toString());
+		Main.pref.put(VM_MRU, mru);
 	}
 	
 	//make a flat copy
-	private void copyGPSLayer()
+	private List<WayPoint> copyGPSLayer(GpxData route)
 	{ 
 		ls = new LinkedList<WayPoint>();
-        for (GpxTrack trk : GPSTrack.tracks) {
+        for (GpxTrack trk : route.tracks) {
             for (GpxTrackSegment segment : trk.getSegments()) {
                 ls.addAll(segment.getWayPoints());
@@ -250,4 +328,5 @@
         }
         Collections.sort(ls); //sort basing upon time
+        return ls;
 	}
   }
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 21761)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideoPlayer.java	(revision 21779)
@@ -9,8 +9,10 @@
 import javax.swing.JButton;
 
+import org.openstreetmap.josm.data.gpx.WayPoint;
 import org.openstreetmap.josm.plugins.videomapping.GpsPlayer;
-
-//combines video and GPS playback
-public class GPSVideoPlayer{
+import org.openstreetmap.josm.plugins.videomapping.PlayerObserver;
+
+//combines video and GPS playback, major control has the video player
+public class GPSVideoPlayer implements PlayerObserver{
 	Timer t;
 	TimerTask syncGPSTrack;
@@ -42,4 +44,5 @@
 				syncBtn.setBackground(Color.GREEN);
 				synced=true;
+				markSyncedPoints();
 				gps.play();
 			}
@@ -47,7 +50,33 @@
 		setSyncMode(true);
 		video.addComponent(syncBtn);
+		//allow sync
+		SimpleVideoPlayer.addObserver(new PlayerObserver() {
+
+			public void playing(long time) {
+				//sync the GPS back
+				if(synced) gps.jump(getGPSTime(time));
+				
+			}
+
+			public void jumping(long time) {
+			
+			}
+			
+			
+		});
 		t = new Timer();		
 	}
 	
+	//marks all points that are covered by video AND GPS track
+	private void markSyncedPoints() {
+		long time;
+		//TODO this is poor, a start/end calculation would be better
+		for (WayPoint wp : gps.getTrack()) {
+			time=getVideoTime(gps.getRelativeTime(wp));
+			if(time>0) wp.attr.put("synced", "true");
+		}
+		
+	}
+
 	public void setSyncMode(boolean b)
 	{
@@ -73,7 +102,18 @@
 	public void play(long gpsstart)
 	{
+		//video is already playing
 		jumpToGPSTime(gpsstart);
 		gps.jump(gpsstart);
-		gps.play();
+		//gps.play();
+	}
+	
+	public void play()
+	{
+		video.play();
+	}
+	
+	public void pause()
+	{
+		video.pause();
 	}
 	
@@ -96,9 +136,5 @@
 	}
 
-	//when we clicked on the layer, here we update the video position
-	public void notifyGPSClick() {
-		if(synced) jumpToGPSTime(gps.getRelativeTime());
-		
-	}
+	
 
 	public void setJumpLength(Integer integer) {
@@ -151,3 +187,34 @@
 
 	
+	//not called by GPS
+	public boolean playing() {
+		return video.playing();
+	}
+
+	//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();
+	}
+
+	public void faster() {
+		video.faster();
+		
+	}
+
+	public void slower() {
+		video.slower();
+		
+	}
+
+	public void playing(long time) {
+		// 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 21761)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/SimpleVideoPlayer.java	(revision 21779)
@@ -37,4 +37,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.plugins.videomapping.PlayerObserver;
+import static org.openstreetmap.josm.tools.I18n.*;
 
 import uk.co.caprica.vlcj.binding.LibVlc;
@@ -60,6 +61,7 @@
 	private final String[] mediaOptions = {""};
 	private boolean syncTimeline=false;
-	private SimpleDateFormat df;
-	private static final Logger LOG = Logger.getLogger(SimpleVideoPlayer.class);
+	private boolean looping=false;
+	private SimpleDateFormat ms;
+	private static final Logger LOG = Logger.getLogger(MediaPlayerFactory.class);
 	private int jumpLength=1000;
 	private int  loopLength=6000;
@@ -86,8 +88,8 @@
 		    mp.setStandardMediaOptions(standardMediaOptions);
 		    //setup GUI
-		    setSize(400, 300);
+		    setSize(400, 300); //later we resize
 		    setAlwaysOnTop(true);
 		    //setIconImage();
-		    df = new SimpleDateFormat("hh:mm:ss:S");
+		    ms = new SimpleDateFormat("hh:mm:ss:S");
 		    scr=new Canvas();
 		    timeline = new JSlider(0,100,0);
@@ -95,8 +97,8 @@
 		    timeline.setMajorTickSpacing(5);
 		    timeline.setPaintTicks(true);
-		    play= new JButton("play");
+		    play= new JButton(tr("play"));
 		    back= new JButton("<");
 		    forward= new JButton(">");
-		    loop= new JToggleButton("loop");
+		    loop= new JToggleButton(tr("loop"));
 		    speed = new JSlider(-200,200,0);
 		    speed.setMajorTickSpacing(100);
@@ -127,9 +129,9 @@
 		catch (NoClassDefFoundError e)
 		{
-			System.err.println("Unable to find JNA Java library!");
+			System.err.println(tr("Unable to find JNA Java library!"));
 		}
 		catch (UnsatisfiedLinkError e)
 		{
-			System.err.println("Unable to find native libvlc library!");
+			System.err.println(tr("Unable to find native libvlc library!"));
 		}
 		
@@ -181,7 +183,5 @@
 			
 			public void actionPerformed(ActionEvent arg0) {
-				mp.setTime((long) (mp.getTime()-jumpLength));
-				//jump(600000); //10,05
-				
+				backward();
 			}
 		});
@@ -190,6 +190,5 @@
 			
 			public void actionPerformed(ActionEvent arg0) {
-				mp.setTime((long) (mp.getTime()+jumpLength));
-				
+				forward();
 			}
 		});
@@ -198,21 +197,5 @@
 
 			public void actionPerformed(ActionEvent arg0) {
-			if(!loop.isSelected())
-			{
-				t.cancel();
-			}
-			else			
-			{
-				final long resetpoint=(long) mp.getTime()-loopLength/2;
-				TimerTask ani=new TimerTask() {
-					
-					@Override
-					public void run() {
-						mp.setTime(resetpoint);
-					}
-				};
-				t= new Timer();
-				t.schedule(ani,loopLength/2,loopLength); //first run a half looptime till reset	
-				}
+				loop();
 			}
 		});
@@ -330,8 +313,9 @@
 		if(mp.isPlaying())
 		{
-			setTitle(df.format(new Date(mp.getTime()))); //FIXME there is a leading hour even at the beginning
+			setTitle(ms.format(new Date(mp.getTime()))); //FIXME there is a leading hour even at the beginning
 			syncTimeline=true;
 			timeline.setValue(Math.round(mp.getPosition()*100));
 			syncTimeline=false;
+			notifyObservers(mp.getTime());
 		}
 	}
@@ -363,14 +347,33 @@
 	}
 
-	public void loop() {		
-		loop.notifyAll();
+	public void loop() {
+		if(looping)
+		{
+			t.cancel();
+			looping=false;
+		}
+		else			
+		{
+			final long resetpoint=(long) mp.getTime()-loopLength/2;
+			TimerTask ani=new TimerTask() {
+				
+				@Override
+				public void run() {
+					mp.setTime(resetpoint);
+				}
+			};
+			t= new Timer();
+			t.schedule(ani,loopLength/2,loopLength); //first run a half looptime till reset
+			looping=true;
+			}
+		
 	}
 
 	public void forward() {
-		forward.notifyAll();	
+		mp.setTime((long) (mp.getTime()+jumpLength));
 	}
 
 	public void backward() {
-		back.notifyAll();
+		mp.setTime((long) (mp.getTime()-jumpLength));
 		
 	}
@@ -396,9 +399,9 @@
 	    }
 
-	    private static void notifyObservers() {
+	    private static void notifyObservers(long newTime) {
 
 	        for (PlayerObserver o : observers) {
 
-	            o.changeSpeed(0.0f);
+	            o.playing(newTime);
 
 	        }
@@ -406,4 +409,27 @@
 	    }
 
+		public String getNativePlayerInfos() {
+			return "VLC "+LibVlc.INSTANCE.libvlc_get_version();
+		}
+
+		public void faster() {
+			speed.setValue(speed.getValue()+100);
+			
+		}
+
+		public void slower() {
+			speed.setValue(speed.getValue()-100);
+			
+		}
+
+		public void pause() {
+			if (mp.isPlaying()) mp.pause();
+			
+		}
+
+		public boolean playing() {
+			return mp.isPlaying();
+		}
+
 	
 
