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 21640)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/GpsPlayer.java	(revision 21656)
@@ -2,4 +2,5 @@
 
 import java.awt.Point;
+import java.io.File;
 import java.sql.Time;
 import java.text.SimpleDateFormat;
@@ -21,4 +22,5 @@
 	private Timer t;
 	private TimerTask ani; //for moving trough the list
+	private boolean autoCenter;
 	
 
@@ -314,4 +316,5 @@
 				public void run() {				
 					next();
+					if(autoCenter) Main.map.mapView.zoomTo(getCurr().getEastNorth());
 					Main.map.mapView.repaint();
 				}
@@ -328,4 +331,16 @@
 		}
 	}
+
+	public long getLength() {
+		return ls.size()*1000; //FIXME this is a poor hack
+	}
+	
+	public void setAutoCenter(boolean b)
+	{
+		this.autoCenter=b;
+	}
+
+
+
 	
 }
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 21656)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/PlayerObserver.java	(revision 21656)
@@ -0,0 +1,10 @@
+package org.openstreetmap.josm.plugins.videomapping;
+
+//an Interface for communication for both players
+public interface PlayerObserver {
+	void paused();
+	void start_playing();
+	void jumping(long relTime);
+	void changeSpeed(float ratio);
+
+}
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 21640)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/PositionLayer.java	(revision 21656)
@@ -34,4 +34,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.InfoAction;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.gpx.GpxData;
@@ -48,4 +49,6 @@
 import org.openstreetmap.josm.tools.Shortcut;
 
+import com.sun.jna.StringArray;
+
 //Basic rendering and GPS layer interaction
 public class PositionLayer extends Layer implements MouseListener,MouseMotionListener {
@@ -81,5 +84,5 @@
 	@Override
 	public Object getInfoComponent() {
-		return null;
+		return tr("{0} covers {1}% of GPS track",gps.getVideo().getName(),gps.getCoverage()*10);
 	}
 
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 21640)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoMappingPlugin.java	(revision 21656)
@@ -4,4 +4,5 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.beans.PropertyChangeListener;
 import java.io.File;
 import java.util.Collections;
@@ -9,7 +10,11 @@
 import java.util.List;
 
+import javax.swing.Action;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JFileChooser;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
+import javax.swing.JRadioButtonMenuItem;
 
 import org.openstreetmap.josm.Main;
@@ -40,8 +45,11 @@
 //Here we manage properties and start the other classes
 public class VideoMappingPlugin extends Plugin implements LayerChangeListener{
-	  private JMenu VMenu;
+	  private JMenu VMenu,VDeinterlacer;
 	  private GpxData GPSTrack;
 	  private List<WayPoint> ls;
-	  private JosmAction VAdd,VStart,Vbackward,Vforward,Vloop;
+	  private JosmAction VAdd,VRemove,VStart,Vbackward,Vforward,Vloop;
+	  private JRadioButtonMenuItem VIntBob,VIntNone,VIntLinear;
+	  private JCheckBoxMenuItem VCenterIcon;
+	  private JMenuItem VJumpLength,VLoopLength;
 	  private GPSVideoPlayer player;
 	  private PositionLayer layer;
@@ -51,6 +59,8 @@
 		super(info);
 		//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		 
+		VMenu = Main.main.menu.addMenu(" Video", KeyEvent.VK_V, Main.main.menu.defaultMenuPos,ht("/Plugin/Videomapping"));//TODO no more ugly " video" hack
 		addMenuItems();
+		loadSettings();
+		enableControlMenus(false);
 		//setup
 		MapView.addLayerChangeListener(this);
@@ -90,9 +100,5 @@
 	//register main controls
 	private void addMenuItems() {
-		VAdd= new JosmAction("Sync Video","videomapping","Sync a video against this GPS track",null,false) {
-
-			/**
-			 * 
-			 */
+		VAdd= new JosmAction("Import Video","videomapping","Sync a video against this GPS track",null,false) {
 			private static final long serialVersionUID = 1L;
 
@@ -101,11 +107,23 @@
 				enableControlMenus(true);
 				layer = new PositionLayer("test",ls);
-				Main.main.addLayer(layer);				
+				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) {
+			private static final long serialVersionUID = 1L;
+
+			public void actionPerformed(ActionEvent arg0) {
+				player.removeVideo();
 			}
 		};
 		VStart = new JosmAction("play/pause", "audio-playpause", "starts/pauses video playback",
-				Shortcut.registerShortcut("videomapping:startstop","",KeyEvent.VK_SPACE, Shortcut.GROUP_MENU), false) {
+				Shortcut.registerShortcut("videomapping:startstop","",KeyEvent.VK_SPACE, Shortcut.GROUP_DIRECT), false) {
 			
 			public void actionPerformed(ActionEvent e) {								
@@ -118,33 +136,90 @@
 		};
 		Vbackward = new JosmAction("backward", "audio-prev", "jumps n sec back",
-				Shortcut.registerShortcut("videomapping:backward","",KeyEvent.VK_NUMPAD4, Shortcut.GROUP_MENU), false) {
-			
-			public void actionPerformed(ActionEvent e) {
-				//layer.backward();
+				Shortcut.registerShortcut("videomapping:backward","",KeyEvent.VK_NUMPAD4, Shortcut.GROUP_DIRECT), false) {
+			
+			public void actionPerformed(ActionEvent e) {
+				player.backward();
 							
 			}
 		};
 		Vforward= new JosmAction("forward", "audio-next", "jumps n sec forward",
-				Shortcut.registerShortcut("videomapping:forward","",KeyEvent.VK_NUMPAD6, Shortcut.GROUP_MENU), false) {
-			
-			public void actionPerformed(ActionEvent e) {
-				//layer.forward();
+				Shortcut.registerShortcut("videomapping:forward","",KeyEvent.VK_NUMPAD6, Shortcut.GROUP_DIRECT), false) {
+			
+			public void actionPerformed(ActionEvent e) {
+				player.forward();
 							
 			}
 		};
 		Vloop= new JosmAction("loop", "clock", "loops n sec around current position",
-				Shortcut.registerShortcut("videomapping:loop","",KeyEvent.VK_NUMPAD5, Shortcut.GROUP_MENU), false) {
-			
-			public void actionPerformed(ActionEvent e) {
-				//layer.loop();
-							
-			}
-		};
-		VMenu.add(VAdd);
-		enableControlMenus(false);
+				Shortcut.registerShortcut("videomapping:loop","",KeyEvent.VK_NUMPAD5, Shortcut.GROUP_DIRECT), false) {
+			
+			public void actionPerformed(ActionEvent e) {
+				player.loop();
+							
+			}
+		};
+		
+		//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) {
+			
+			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) {
+			
+			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));
+							
+			}
+		});
+		
+		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");
+			}
+		});
+		VDeinterlacer.add(VIntNone);
+		VDeinterlacer.add(VIntBob);
+		VDeinterlacer.add(VIntLinear);
+		
+		VMenu.add(VAdd);		
 		VMenu.add(VStart);
 		VMenu.add(Vbackward);
 		VMenu.add(Vforward);
 		VMenu.add(Vloop);
+		VMenu.addSeparator();
+		VMenu.add(VCenterIcon);
+		VMenu.add(VJumpLength);
+		VMenu.add(VLoopLength);
+		VMenu.add(VDeinterlacer);
 	}
 	
@@ -158,4 +233,9 @@
 		Vforward.setEnabled(enabled);
 		Vloop.setEnabled(enabled);
+	}
+	
+	//load all properties
+	private void loadSettings() {
+		VIntNone.setSelected(true);
 	}
 	
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 21640)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideoPlayer.java	(revision 21656)
@@ -9,6 +9,4 @@
 import javax.swing.JButton;
 
-import org.openstreetmap.josm.command.AddCommand;
-import org.openstreetmap.josm.data.gpx.WayPoint;
 import org.openstreetmap.josm.plugins.videomapping.GpsPlayer;
 
@@ -103,4 +101,53 @@
 		
 	}
+
+	public void setJumpLength(Integer integer) {
+		video.setJumpLength(integer);
+		
+	}
+
+	public void setLoopLength(Integer integer) {
+		video.setLoopLength(integer);
+		
+	}
+
+	public void loop() {
+		video.loop();
+		
+	}
+
+	public void forward() {
+		video.forward();
+		
+	}
+
+	public void backward() {
+		video.backward();
+		
+	}
+
+	public void removeVideo() {
+		video.removeVideo();
+		
+	}
+
+	public File getVideo() {
+		return file;
+	}
+
+	public float getCoverage() {
+		return gps.getLength()/video.getLength();
+	}
+
+	public void setDeinterlacer(String string) {
+		video.setDeinterlacer(string);
+		
+	}
+
+	public void setAutoCenter(boolean selected) {
+		gps.setAutoCenter(selected);
+		
+	}
+
 	
 }
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 21640)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/SimpleVideoPlayer.java	(revision 21656)
@@ -5,4 +5,5 @@
 import java.awt.BorderLayout;
 import java.awt.Canvas;
+import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.event.ActionEvent;
@@ -14,4 +15,7 @@
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Set;
 import java.util.Timer;
 import java.util.TimerTask;
@@ -24,4 +28,5 @@
 import javax.swing.JComponent;
 import javax.swing.JFrame;
+import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JSlider;
@@ -31,4 +36,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.plugins.videomapping.PlayerObserver;
 
 import uk.co.caprica.vlcj.binding.LibVlc;
@@ -56,4 +62,7 @@
 	private SimpleDateFormat df;
 	private static final Logger LOG = Logger.getLogger(SimpleVideoPlayer.class);
+	private int jumpLength=1000;
+	private int  loopLength=6000;
+	private static Set<PlayerObserver> observers = new HashSet<PlayerObserver>(); //we have to implement our own Observer pattern
 	
 	public SimpleVideoPlayer() {
@@ -78,15 +87,27 @@
 		    //setup GUI
 		    setSize(400, 300);
+		    setAlwaysOnTop(true);
+		    //setIconImage();
 		    df = new SimpleDateFormat("hh:mm:ss:S");
 		    scr=new Canvas();
-		    timeline = new JSlider(0,100,0); //TODO better setup for ticks
+		    timeline = new JSlider(0,100,0);
+		    timeline.setMajorTickSpacing(10);
+		    timeline.setMajorTickSpacing(5);
+		    timeline.setPaintTicks(true);
 		    play= new JButton("play");
 		    back= new JButton("<");
 		    forward= new JButton(">");
 		    loop= new JToggleButton("loop");
-		    speed = new JSlider(0,2,1);
-			speed.setPaintTicks(true);
-			speed.setMajorTickSpacing(5);
+		    speed = new JSlider(-200,200,0);
+		    speed.setMajorTickSpacing(100);
+			speed.setPaintTicks(true);			
 			speed.setOrientation(Adjustable.VERTICAL);
+			Hashtable labelTable = new Hashtable();
+			labelTable.put( new Integer( 0 ), new JLabel("1x") );
+			labelTable.put( new Integer( -200 ), new JLabel("-2x") );
+			labelTable.put( new Integer( 200 ), new JLabel("2x") );
+			speed.setLabelTable( labelTable );
+			speed.setPaintLabels(true);
+
 		    setLayout();
 			addListeners();
@@ -137,6 +158,4 @@
 	//add UI functionality
 	private void addListeners() {
-		final float JUMP_LENGTH=1000;
-		final int  LOOP_LENGTH=6000;
 		timeline.addChangeListener(new ChangeListener() {
 			public void stateChanged(ChangeEvent e) {
@@ -162,5 +181,5 @@
 			
 			public void actionPerformed(ActionEvent arg0) {
-				mp.setTime((long) (mp.getTime()-JUMP_LENGTH));
+				mp.setTime((long) (mp.getTime()-jumpLength));
 				//jump(600000); //10,05
 				
@@ -171,5 +190,5 @@
 			
 			public void actionPerformed(ActionEvent arg0) {
-				mp.setTime((long) (mp.getTime()+JUMP_LENGTH));
+				mp.setTime((long) (mp.getTime()+jumpLength));
 				
 			}
@@ -185,5 +204,5 @@
 			else			
 			{
-				final long resetpoint=(long) mp.getTime()-LOOP_LENGTH/2;
+				final long resetpoint=(long) mp.getTime()-loopLength/2;
 				TimerTask ani=new TimerTask() {
 					
@@ -194,5 +213,5 @@
 				};
 				t= new Timer();
-				t.schedule(ani,LOOP_LENGTH/2,LOOP_LENGTH); //first run a half looptime till reset	
+				t.schedule(ani,loopLength/2,loopLength); //first run a half looptime till reset	
 				}
 			}
@@ -202,5 +221,11 @@
 			
 			public void stateChanged(ChangeEvent arg0) {
-				// TODO change playback speed
+				if(!speed.getValueIsAdjusting()&&(mp.isPlaying()))
+				{
+					int perc = speed.getValue();
+					float ratio= (float) (perc/400f*1.75);
+					ratio=ratio+(9/8);
+					mp.setRate(ratio);
+				}
 				
 			}
@@ -218,5 +243,7 @@
 
 	public void metaDataAvailable(MediaPlayer arg0, VideoMetaData data) {
-		scr.setSize(data.getVideoDimension());
+		final float perc = 0.5f;
+		Dimension org=data.getVideoDimension();
+		scr.setSize(new Dimension((int)(org.width*perc), (int)(org.height*perc)));
 		pack();
 
@@ -293,4 +320,9 @@
 	}
 	
+	public boolean isPlaying()
+	{
+		return mp.isPlaying();
+	}
+	
 	//gets called by the Syncer to update all components
 	public void updateTime ()
@@ -298,5 +330,5 @@
 		if(mp.isPlaying())
 		{
-			setTitle(df.format(new Date(mp.getTime()))+" "+mp.getTime());
+			setTitle(df.format(new Date(mp.getTime()))); //FIXME there is a leading hour even at the beginning
 			syncTimeline=true;
 			timeline.setValue(Math.round(mp.getPosition()*100));
@@ -311,4 +343,67 @@
 		pack();
 	}
+
+	public long getLength() {		
+		return mp.getLength();
+	}
+
+	public void setDeinterlacer(String string) {
+		mp.setDeinterlace(string);
+		
+	}
+
+	public void setJumpLength(Integer integer) {
+		jumpLength=integer;
+		
+	}
+
+	public void setLoopLength(Integer integer) {
+		loopLength = integer;
+		
+	}
+
+	public void loop() {		
+		loop.notifyAll();
+	}
+
+	public void forward() {
+		forward.notifyAll();	
+	}
+
+	public void backward() {
+		back.notifyAll();
+		
+	}
+
+	public void removeVideo() {
+		if (mp.isPlaying()) mp.stop();
+		mp.release();
+		
+	}
+
+	public static void addObserver(PlayerObserver observer) {
+
+	        observers.add(observer);
+
+	    }
+
+	 
+
+	    public static void removeObserver(PlayerObserver observer) {
+
+	        observers.remove(observer);
+
+	    }
+
+	    private static void notifyObservers() {
+
+	        for (PlayerObserver o : observers) {
+
+	            o.changeSpeed(0.0f);
+
+	        }
+
+	    }
+
 	
 
Index: applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/Syncer.java
===================================================================
--- applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/Syncer.java	(revision 21640)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/Syncer.java	(revision 21656)
@@ -19,8 +19,8 @@
     	  //here we update
         public void run() {
-        	pl.updateTime();
-
+        	if (pl.isPlaying())	pl.updateTime(); //if the video is seeking we get a mess
         }
       });
+      
     }
   }
Index: applications/editors/josm/plugins/videomapping/test/videotest.java
===================================================================
--- applications/editors/josm/plugins/videomapping/test/videotest.java	(revision 21640)
+++ applications/editors/josm/plugins/videomapping/test/videotest.java	(revision 21656)
@@ -28,4 +28,5 @@
 		sVP.setFile(new File("C:\\TEMP\\test.mpg"));
 		sVP.play(); //FIXME We have a bug so we get out of sync if we jump before the video is up (and this we CAN'T DETECT!!!)
+		/*
 		JButton b = new JButton("jump");
 		b.addActionListener(new ActionListener() {
@@ -36,5 +37,5 @@
 		});
 		sVP.add(b);
-
+		*/
 	}
 
