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 25755)
+++ 	(revision )
@@ -1,328 +1,0 @@
-package org.openstreetmap.josm.plugins.videomapping;
-
-
-import java.text.SimpleDateFormat;
-import java.util.Collections;
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-import java.awt.Color;
-import java.awt.Cursor;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
-import java.io.File;
-
-import javax.swing.*;
-
-import static org.openstreetmap.josm.tools.I18n.*;
-
-import org.openstreetmap.josm.Main;
-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.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;
-
-//Basic rendering and GPS layer interaction
-public class PositionLayer extends Layer implements MouseListener,MouseMotionListener {
-    private List<WayPoint> ls;
-    private List<WayPoint> ipos;
-    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 gpsTimeCode;
-    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");
-        gpsTimeCode= new SimpleDateFormat("HH:mm:ss");//TODO replace with DF small
-        Main.map.mapView.addMouseListener(this);
-        Main.map.mapView.addMouseMotionListener(this);                          
-        gpsVP = new GPSVideoPlayer(video, gps);
-        gps.goTo(0);
-        ipos=gps.interpolate();
-        iconPosition=gps.getCurr();        
-    }
-    
-    //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;
-    }
-
-
-    @Override
-    public Icon getIcon() {
-        return icon;
-    }
-
-    @Override
-    public Object getInfoComponent() {
-        String temp;
-        String sep=System.getProperty("line.separator");
-        temp=tr("{0} {1}% of GPS track",gpsVP.getVideo().getName(),gpsVP.getCoverage()*10+sep);
-        temp=temp+gpsVP.getNativePlayerInfos();
-        return temp;
-    }
-
-    @Override
-	public Action[] getMenuEntries() {
-        return new Action[]{
-                LayerListDialog.getInstance().createActivateLayerAction(this),
-                LayerListDialog.getInstance().createShowHideLayerAction(),
-                LayerListDialog.getInstance().createDeleteLayerAction(),
-                SeparatorLayerAction.INSTANCE,
-                //TODO here my stuff
-                SeparatorLayerAction.INSTANCE,
-                new LayerListPopup.InfoAction(this)};//TODO here infos about the linked videos
-	}
-
-      
-
-
-    @Override
-    public String getToolTipText() {
-        return tr("Shows current position in the video");
-    }
-
-    // no merging necessary
-    @Override
-    public boolean isMergable(Layer arg0) {
-        return false;
-    }
-
-    @Override
-    public void mergeFrom(Layer arg0) {
-        
-    }
-
-    
-    
-    @Override
-    //Draw the current position, infos, waypoints
-    public void paint(Graphics2D g, MapView map, Bounds bound) {
-        Point p;
-        //TODO Source out redundant calculations
-        //draw all GPS points
-        g.setColor(Color.YELLOW); //new Color(0,255,0,128)
-        for(WayPoint n: ls) {
-            p = Main.map.mapView.getPoint(n.getEastNorth());
-            g.drawOval(p.x - 2, p.y - 2, 4, 4);
-        }
-        //draw synced points
-        g.setColor(Color.GREEN);
-        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(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(gps.getCurr().getEastNorth());
-            g.drawLine(p.x, p.y, p2.x, p2.y);
-        }
-        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(gps.getCurr().getEastNorth());
-            g.drawLine(p.x, p.y, p2.x, p2.y);
-        }
-        //draw interpolated points
-        g.setColor(Color.CYAN);
-        g.setBackground(Color.CYAN);
-        //LinkedList<WayPoint> ipo=(LinkedList<WayPoint>) gps.getInterpolatedLine(5);
-        for (WayPoint wp : ipos) {
-            p=Main.map.mapView.getPoint(wp.getEastNorth());
-            g.fillArc(p.x, p.y, 4, 4, 0, 360);
-            //g.drawOval(p.x - 2, p.y - 2, 4, 4);
-        }
-        //draw cam icon
-        g.setColor(Color.RED);
-        if(dragIcon)
-        {
-            if(iconPosition!=null)
-            {
-                p=Main.map.mapView.getPoint(iconPosition.getEastNorth());
-                icon.paintIcon(null, g, p.x-icon.getIconWidth()/2, p.y-icon.getIconHeight()/2);             
-                //g.drawString(mins.format(iconPosition.getTime()),p.x-10,p.y-10); //TODO when synced we might wan't to use a different layout
-                g.drawString(gpsTimeCode.format(iconPosition.getTime()),p.x-15,p.y-15);
-            }
-        }
-        else
-        {
-            if (gps.getCurr()!=null){
-            p=Main.map.mapView.getPoint(gps.getIPO().getEastNorth());
-            icon.paintIcon(null, g, p.x-icon.getIconWidth()/2, p.y-icon.getIconHeight()/2);         
-            g.drawString(gpsTimeCode.format(gps.getCurr().getTime()),p.x-15,p.y-15);
-            }
-        }
-    }
-    
-    //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 : 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());
-            if (rect.contains(p))
-            {               
-                return n;
-            }
-            
-        }
-        return null;
-        
-    }
-    
-    //upper left corner like rectangle
-    private Rectangle getIconRect()
-    {
-        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());
-    }
-
-
-    @Override
-    public void visitBoundingBox(BoundingXYVisitor arg0) {
-        // TODO don't know what to do here
-
-    }
-
-    public void mouseClicked(MouseEvent e) {        
-    }
-
-    public void mouseEntered(MouseEvent arg0) { 
-    }
-
-    public void mouseExited(MouseEvent arg0) {
-    }
-
-    //init drag&drop
-    public void mousePressed(MouseEvent e) {
-        if(e.getButton() == MouseEvent.BUTTON1) {
-            //is it on the cam icon?
-            if (gps.getCurr()!=null)
-            {
-                if (getIconRect().contains(e.getPoint()))
-                {
-                    mouse=e.getPoint();
-                    dragIcon=true;
-                }
-            }
-        }
-        
-    }
-    
-    //
-    public void mouseReleased(MouseEvent e) {       
-        //only leftclicks on our layer
-        if(e.getButton() == MouseEvent.BUTTON1) {
-            if(dragIcon)
-            {
-                dragIcon=false;
-            }
-            else
-            {            	
-                //simple click
-            	WayPoint wp = getNearestWayPoint(e.getPoint());            	
-                if(wp!=null)
-                {
-                	//jump if unsynced
-                	if (gpsVP.isSynced())
-                	{
-                		//jump if we know position
-                        if(wp.attr.containsKey("synced"))
-                        {
-                        	gps.goTo(wp);
-                            if(gpsVP!=null) gpsVP.jumpToGPSTime(new Date(gps.getRelativeTime())); //call videoplayers to set right position
-                        }
-                	}
-                	else
-                	{
-                		//otherwise let user mark possible sync point
-                		gps.goTo(wp);
-                	}
-                    
-                }
-            }
-            Main.map.mapView.repaint();
-        }
-        
-    }
-    
-    //slide and restrict during movement
-    public void mouseDragged(MouseEvent e) {        
-        if(dragIcon)
-        {           
-            mouse=e.getPoint();
-            //restrict to GPS track
-            iconPosition=gps.getInterpolatedWaypoint(mouse);
-            Main.map.mapView.repaint();
-        }
-    }
-
-    //visualize drag&drop
-    public void mouseMoved(MouseEvent e) {      
-        if (gps.getCurr()!=null)
-        {                       
-            if (getIconRect().contains(e.getPoint()))
-            {
-                Main.map.mapView.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
-            }
-            else
-            {
-                Main.map.mapView.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
-            }
-        }
-        
-    }
-
-	public  void setVideopPlayer(GPSVideoPlayer player) {
-		gpsVP=player;
-		
-	}
-	
-	public GPSVideoPlayer getVideoPlayer()
-	{
-		return gpsVP;
-	}
-	
-	public String getGPSTime()
-	{
-		return gpsTimeCode.format(iconPosition.getTime());
-	}
-}
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 25755)
+++ 	(revision )
@@ -1,368 +1,0 @@
-package org.openstreetmap.josm.plugins.videomapping;
-
-import java.awt.BorderLayout;
-import java.awt.Panel;
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-import java.io.File;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-import javax.swing.Box;
-import javax.swing.InputVerifier;
-import javax.swing.JButton;
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JComponent;
-import javax.swing.JDialog;
-import javax.swing.JFileChooser;
-import javax.swing.JFormattedTextField;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JRadioButtonMenuItem;
-import javax.swing.SwingUtilities;
-import javax.swing.text.MaskFormatter;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.plugins.*;
-import org.openstreetmap.josm.plugins.videomapping.video.GPSVideoPlayer;
-import org.openstreetmap.josm.tools.Shortcut;
-import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
-import org.openstreetmap.josm.gui.layer.*;
-
-import uk.co.caprica.vlcj.runtime.windows.WindowsRuntimeUtil;
-
-import com.sun.jna.NativeLibrary;
-
-import static org.openstreetmap.josm.tools.I18n.*;
-import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
-
-  /**
- * @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 
- */
-
-//Here we manage properties and start the other classes
-public class VideoMappingPlugin extends Plugin implements LayerChangeListener{
-      private JMenu VMenu,VDeinterlacer;
-      private GpxLayer GpsLayer;
-      private JosmAction VAdd,VRemove,VStart,Vbackward,Vforward,VJump,Vfaster,Vslower,Vloop;
-      private JRadioButtonMenuItem VIntBob,VIntNone,VIntLinear;
-      private JCheckBoxMenuItem VCenterIcon,VSubTitles;
-      private JMenuItem VJumpLength,VLoopLength;
-      private GPSVideoPlayer player;
-      private PositionLayer layer;
-      private final String VM_DEINTERLACER="videomapping.deinterlacer"; //where we store settings
-      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 String deinterlacer;
-      private boolean autocenter;
-      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
-        VMenu.setEnabled(false);
-        addMenuItems();
-        enableControlMenus(false);
-        loadSettings();
-        applySettings();
-        //further plugin informations are provided by build.xml properties
-        //NativeLibrary.addSearchPath("vlc", "C:\\Programme\\Video\\VLC"); // this should be the directory that contains libvlc.dll
-        NativeLibrary.addSearchPath("libvlc", WindowsRuntimeUtil.getVlcInstallDir());
-    }
-            
-    //only use with GPS and own layers
-    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        VMenu.setEnabled(true);
-        if (newLayer instanceof GpxLayer)
-        {
-            VAdd.setEnabled(true);
-            GpsLayer=((GpxLayer) newLayer);            
-            //TODO append to GPS Layer menu
-        }        
-    }
-
-    public void layerAdded(Layer arg0) {
-        activeLayerChange(null,arg0);
-    }
-
-    public void layerRemoved(Layer arg0) {
-    	if(Main.main.getActiveLayer()==null)	VMenu.setEnabled(false);
-    } //well ok we have allready a local copy of the GPS track....
-
-    //register main controls
-    private void addMenuItems() {
-        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) {                 
-                    JFileChooser fc = new JFileChooser(mru);
-                    fc.setSelectedFile(new File(mru));
-                    if(fc.showOpenDialog(Main.main.parent)!=JFileChooser.CANCEL_OPTION)
-                    {
-                    	//save selected path
-                    	mru=fc.getSelectedFile().getAbsolutePath();
-                    	Main.pref.put(VM_MRU, mru);
-                        enableControlMenus(true);
-                        layer = new PositionLayer(fc.getSelectedFile(),GpsLayer);
-                        Main.main.addLayer(layer);
-                        //TODO Check here if we can sync allready now
-                        VAdd.setEnabled(false);
-                        VRemove.setEnabled(true);
-                        layer.getVideoPlayer().setSubtitleAction(VSubTitles);
-                        player=layer.getVideoPlayer();
-                    }
-                }
-        
-        };
-        VRemove= new JosmAction(tr("Remove Video"),"videomapping",tr("removes current video from layer"),null,false) {
-            private static final long serialVersionUID = 1L;
-
-            public void actionPerformed(ActionEvent arg0) {
-                player.removeVideo();
-            }
-        };
-        
-        VStart = new JosmAction(tr("Play/Pause"), "audio-playpause", tr("starts/pauses video playback"),
-                Shortcut.registerShortcut("videomapping:startstop","Video: "+tr("Play/Pause"),KeyEvent.VK_NUMPAD5, Shortcut.GROUP_DIRECT), false) {
-            
-            public void actionPerformed(ActionEvent e) {                                
-                if(player.playing()) player.pause(); else player.play();
-            }
-        };
-        Vbackward = new JosmAction(tr("Backward"), "audio-prev", tr("jumps n sec back"),
-                Shortcut.registerShortcut("videomapping:backward","Video: "+tr("Backward"),KeyEvent.VK_NUMPAD4, Shortcut.GROUP_DIRECT), false) {
-            public void actionPerformed(ActionEvent e) {
-                player.backward();
-            }
-        };
-        Vforward= new JosmAction(tr("Forward"), "audio-next", tr("jumps n sec forward"),
-                Shortcut.registerShortcut("videomapping:forward","Video: "+tr("Forward"),KeyEvent.VK_NUMPAD6, Shortcut.GROUP_DIRECT), false) {
-            
-            public void actionPerformed(ActionEvent e) {
-                player.forward();
-                            
-            }
-        };
-        Vfaster= new JosmAction(tr("Faster"), "audio-faster", tr("faster playback"),
-                Shortcut.registerShortcut("videomapping:faster","Video: "+tr("Faster"),KeyEvent.VK_NUMPAD8, 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","Video: "+tr("Slower"),KeyEvent.VK_NUMPAD2, Shortcut.GROUP_DIRECT), false) {
-            
-            public void actionPerformed(ActionEvent e) {
-                player.slower();
-                            
-            }
-        };
-        VJump= new JosmAction(tr("Jump To"), "jumpto", tr("jumps to the entered gps time"),null, false) {          
-            public void actionPerformed(ActionEvent e) {
-            	String s;
-            	try {
-            	JOptionPane d=new JOptionPane(tr("Jump to"), JOptionPane.QUESTION_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
-            	final JFormattedTextField inp = new JFormattedTextField(new MaskFormatter("##:##:##"));
-            	inp.setText(layer.getGPSTime());
-            	inp.setInputVerifier(new InputVerifier() {					
-					@Override
-					public boolean verify(JComponent input) {
-						return false;
-					}
-				});
-            	//hack to set the focus
-            	SwingUtilities.invokeLater(new Runnable() {
-                    public void run() {
-                    	inp.requestFocus();
-                    }
-                });
-            	//TODO here we should show the GPS time range to the user
-            	if(d.showConfirmDialog(Main.main.panel,inp, tr("Jump to"),JOptionPane.OK_CANCEL_OPTION)==JOptionPane.OK_OPTION)
-            	{
-	            	Date t;
-	                SimpleDateFormat sdf= new SimpleDateFormat("HH:mm:ss");
-	                t = sdf.parse(inp.getText());
-	                if (t!=null)
-	                {
-	                    player.jumpToGPSTime(t);
-	                }                       
-            	}
-            	} catch (ParseException e1) {
-	                    // TODO Auto-generated catch block
-	                    e1.printStackTrace();
-	            }
-
-            }
-                            
-            
-        };
-        Vloop= new JosmAction(tr("Loop"), "loop", tr("loops n sec around current position"),
-                Shortcut.registerShortcut("videomapping:loop","Video: "+tr("loop"),KeyEvent.VK_NUMPAD7, Shortcut.GROUP_DIRECT), false) {
-            
-            public void actionPerformed(ActionEvent e) {
-                player.loop();
-                            
-            }
-        };
-        
-        //now the options menu
-        VCenterIcon = new JCheckBoxMenuItem(new JosmAction(tr("Keep centered"), null, tr("follows the video icon automaticly"),null, false) {
-            
-            public void actionPerformed(ActionEvent e) {
-                autocenter=VCenterIcon.isSelected();
-                player.setAutoCenter(autocenter);
-                applySettings();
-                saveSettings();
-                            
-            }
-        });
-        //now the options menu
-        VSubTitles = new JCheckBoxMenuItem(new JosmAction(tr("Subtitles"), null, tr("Show subtitles in video"),null, false) {
-            
-            public void actionPerformed(ActionEvent e) {
-                player.toggleSubtitles();
-                            
-            }
-        });
-        
-        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,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,tr("Jump in video for x ms"),tr("Loop length"),JOptionPane.QUESTION_MESSAGE,null,possibilities,looplength);
-                looplength=Integer.getInteger(s);
-                applySettings();
-                saveSettings();
-                            
-            }
-        });
-        
-        VDeinterlacer= new JMenu("Deinterlacer");
-        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();
-            }
-        });
-        VDeinterlacer.add(VIntNone);
-        VDeinterlacer.add(VIntBob);
-        VDeinterlacer.add(VIntLinear);
-        
-        VMenu.add(VAdd);        
-        VMenu.add(VStart);
-        VMenu.add(Vbackward);
-        VMenu.add(Vforward);
-        VMenu.add(Vfaster);
-        VMenu.add(Vslower);
-        VMenu.add(Vloop);
-        VMenu.add(VJump);
-        VMenu.addSeparator();
-        VMenu.add(VCenterIcon);
-        VMenu.add(VJumpLength);
-        VMenu.add(VLoopLength);
-        VMenu.add(VDeinterlacer);
-        VMenu.add(VSubTitles);
-        
-    }
-    
-    
-    //we can only work on our own layer
-    private void enableControlMenus(boolean enabled)
-    {
-        VStart.setEnabled(enabled);
-        Vbackward.setEnabled(enabled);
-        Vforward.setEnabled(enabled);
-        Vloop.setEnabled(enabled);
-        Vfaster.setEnabled(enabled);
-        Vslower.setEnabled(enabled);
-        VJump.setEnabled(enabled);
-        
-    }
-    
-    //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());        
-    }
-    
-    
-  }
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 25765)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoPlugin.java	(revision 25765)
@@ -0,0 +1,75 @@
+package org.openstreetmap.josm.plugins.videomapping;
+
+import java.awt.BorderLayout;
+import java.awt.Panel;
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import javax.swing.Box;
+import javax.swing.InputVerifier;
+import javax.swing.JButton;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JFileChooser;
+import javax.swing.JFormattedTextField;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JRadioButtonMenuItem;
+import javax.swing.SwingUtilities;
+import javax.swing.text.MaskFormatter;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.plugins.*;
+import org.openstreetmap.josm.plugins.videomapping.video.GPSVideoPlayer;
+import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.MapView.LayerChangeListener;
+import org.openstreetmap.josm.gui.layer.*;
+
+import uk.co.caprica.vlcj.runtime.windows.WindowsRuntimeUtil;
+
+import com.sun.jna.NativeLibrary;
+
+import static org.openstreetmap.josm.tools.I18n.*;
+import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
+
+  /**
+ * @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 
+ */
+
+//Here we manage properties and start the other classes
+public class VideoPlugin extends Plugin implements LayerChangeListener{
+
+	public VideoPlugin(PluginInformation info) {
+		super(info);
+		// TODO Auto-generated constructor stub
+	}
+
+	public void activeLayerChange(Layer arg0, Layer arg1) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void layerAdded(Layer arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void layerRemoved(Layer arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+      
+    
+    
+  }
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 25765)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/VideoPositionLayer.java	(revision 25765)
@@ -0,0 +1,128 @@
+package org.openstreetmap.josm.plugins.videomapping;
+
+
+import java.text.SimpleDateFormat;
+import java.util.Collections;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.awt.Color;
+import java.awt.Cursor;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.io.File;
+
+import javax.swing.*;
+
+import static org.openstreetmap.josm.tools.I18n.*;
+
+import org.openstreetmap.josm.Main;
+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.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;
+
+//Basic rendering and GPS layer interaction
+public class VideoPositionLayer extends Layer implements MouseListener,MouseMotionListener {
+
+	public VideoPositionLayer(String name) {
+		super(name);
+		// TODO Auto-generated constructor stub
+	}
+
+	@Override
+	public Icon getIcon() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Object getInfoComponent() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Action[] getMenuEntries() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public String getToolTipText() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public boolean isMergable(Layer arg0) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void mergeFrom(Layer arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void paint(Graphics2D arg0, MapView arg1, Bounds arg2) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@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 arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void mouseReleased(MouseEvent arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void mouseDragged(MouseEvent arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void mouseMoved(MouseEvent arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+    
+}
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 25765)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideo.java	(revision 25765)
@@ -0,0 +1,8 @@
+package org.openstreetmap.josm.plugins.videomapping.video;
+import java.io.File;
+
+// a specific synced video
+public class GPSVideo {
+   
+
+}
Index: applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideoFile.java
===================================================================
--- applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideoFile.java	(revision 25755)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package org.openstreetmap.josm.plugins.videomapping.video;
-import java.io.File;
-
-// a specific synced video
-public class GPSVideoFile extends File{
-    public long offset; //time difference in ms between GPS and Video track
-    
-    public GPSVideoFile(File f, long offset) {
-        super(f.getAbsoluteFile().toString());
-        this.offset=offset;
-    }
-
-}
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 25755)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/GPSVideoPlayer.java	(revision 25765)
@@ -22,266 +22,5 @@
 public class GPSVideoPlayer
 {
-    Timer t;
-    TimerTask updateGPS; //sync GPS position here
-    private GpsPlayer gps;
-    private SimpleVideoPlayer video;
-    private JButton syncBtn;
-    private GPSVideoFile file;
-    private boolean synced=false; //do we playback the players together?
-    private JCheckBoxMenuItem subtTitleComponent;
     
-
-    public GPSVideoPlayer(File f, final GpsPlayer pl) {
-        super();
-        this.gps = pl;
-        //test sync
-        video = new SimpleVideoPlayer();
-        /*
-        long gpsT=(9*60+20)*1000;
-        long videoT=10*60*1000+5*1000;
-        setFile(new GPSVideoFile(f, gpsT-videoT)); */
-        setFile(new GPSVideoFile(f, 0L));
-        //add Sync Button to the Player
-        syncBtn= new JButton("sync");
-        syncBtn.setBackground(Color.RED);
-        syncBtn.addActionListener(new ActionListener() {
-            //do a sync
-            public void actionPerformed(ActionEvent e) {
-            	if (!synced)
-            	{
-            		//FIXME doesn't work correctly after a resync
-            		//determine time offset
-	                long diff=gps.getRelativeTime()-video.getTime(); //FIXME differenzierter betrachten
-	                file= new GPSVideoFile(file, diff);
-	                syncBtn.setBackground(Color.GREEN);
-	                synced=true;
-	                markSyncedPoints();
-	                video.play();
-	                //gps.play();
-            	}
-            	else
-            	{
-            		//let user resync again
-            		synced=false;
-            		syncBtn.setBackground(null);
-            	}
-            }
-        });
-        setAsyncMode(true);
-        video.addComponent(syncBtn);
-        //a observer to communicate
-        SimpleVideoPlayer.addObserver(new VideoObserver() { //TODO has o become this
-
-            public void playing(long time) {
-                //sync the GPS back
-                if(synced) {
-                	gps.jump(getGPSTime(time));
-                	gps.jumpIPO(getGPSTime(time));
-                }
-                
-            }
-
-            public void jumping(long time) {
-            
-            }
-
-            //a push way to set video attirbutes
-            public void metadata(long time, boolean subtitles) {
-                if(subtTitleComponent!=null) subtTitleComponent.setSelected(subtitles);             
-            }
-            
-        });
-        t = new Timer();        
-    }
-    
-    //marks all points that are covered by video AND GPS track
-    private void markSyncedPoints() {
-        //GPS or video stream starts first in time?
-        WayPoint start,end;
-        long t;
-        if(gps.getLength()<video.getLength())
-        {
-            //GPS is within video timeperiod
-            start=gps.getWaypoint(0);
-            end=gps.getWaypoint(gps.getLength());           
-        }
-        else
-        {
-            //video is within gps timeperiod
-            t=getGPSTime(0);
-            if(t<0) t=0;
-            start=gps.getWaypoint(t);
-            end=gps.getWaypoint(getGPSTime(video.getLength()));
-        }
-        //mark as synced
-        List<WayPoint> ls = gps.getTrack().subList(gps.getTrack().indexOf(start), gps.getTrack().indexOf(end));
-        
-        for (WayPoint wp : ls) {
-        	wp.attr.clear();
-            wp.attr.put("synced", "true");
-        }   
-    }
-
-    public void setAsyncMode(boolean b)
-    {
-        if(b)
-        {
-            syncBtn.setVisible(true);
-        }
-        else
-        {
-            syncBtn.setVisible(false);
-        }
-    }
-    
-        
-    public void setFile(GPSVideoFile f)
-    {
-        
-        file=f;
-        video.setFile(f.getAbsoluteFile());
-        //video.play();
-    }
-    
-    /*
-    public void play(long gpsstart)
-    {
-        //video is already playing
-        jumpToGPSTime(gpsstart);
-        gps.jump(gpsstart);
-        //gps.play();
-    }
-    */
-    
-    public void play()
-    {
-        video.play();
-    }
-    
-    public void pause()
-    {
-        video.pause();
-    }
-    
-   
-    //jumps in video to the corresponding GPS time(xx:yy:zz) not date (external triggered)
-    public void jumpToGPSTime(java.util.Date date)
-    {
-        if(!synced)
-        {
-            //when not synced we can just move the icon to the right position           
-            gps.jump(date);
-            Main.map.mapView.repaint();
-        }
-        video.jump(getVideoTime(date.getTime()));
-    }
-    
-    //calc synced timecode from video
-    private long getVideoTime(long GPStime)
-    {
-        return GPStime-file.offset;
-    }
-    
-    //calc corresponding GPS time
-    private long getGPSTime(long videoTime)
-    {
-        return videoTime+file.offset;
-    }
-
-    
-
-    public void setJumpLength(Integer integer) {
-        video.setJumpLength(integer);
-        
-    }
-
-    public void setLoopLength(Integer integer) {
-        video.setLoopLength(integer);
-        
-    }
-    
-    public boolean isSynced()
-    {
-        return synced;
-    }
-
-    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);
-        
-    }
-
-    
-    //not called by GPS
-    public boolean playing() {
-        return video.playing();
-    }
-
-    
-    public String getNativePlayerInfos() {
-        return video.getNativePlayerInfos();
-    }
-
-    public void faster() {
-        video.faster();
-        
-    }
-
-    public void slower() {
-        video.slower();
-        
-    }
-
-
-    public void toggleSubtitles() {
-        video.toggleSubs();
-        
-    }
-    
-    public boolean hasSubtitles(){
-        return video.hasSubtitles();
-    }
-
-    public void setSubtitleAction(JCheckBoxMenuItem a)
-    {
-        subtTitleComponent=a;
-    }
-    
-    public void close()
-    {
-    	video.windowClosing(new WindowEvent(video,1));
-    }
     
 
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 25755)
+++ 	(revision )
@@ -1,551 +1,0 @@
-package org.openstreetmap.josm.plugins.videomapping.video;
-import java.awt.Adjustable;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.helpers.DateTimeDateFormat;
-
-import java.awt.BorderLayout;
-import java.awt.Canvas;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.WindowEvent;
-import java.awt.event.WindowListener;
-import java.beans.PropertyChangeListener;
-import java.io.File;
-import java.sql.Time;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Hashtable ;
-import java.util.Set;
-import java.util.TimeZone;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-
-import javax.swing.Action;
-import javax.swing.JButton;
-import javax.swing.JComponent;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-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.VideoObserver;
-import static org.openstreetmap.josm.tools.I18n.*;
-
-import uk.co.caprica.vlcj.binding.LibVlc;
-import uk.co.caprica.vlcj.player.MediaPlayer;
-import uk.co.caprica.vlcj.player.MediaPlayerEventAdapter;
-import uk.co.caprica.vlcj.player.MediaPlayerEventListener;
-import uk.co.caprica.vlcj.player.MediaPlayerFactory;
-import uk.co.caprica.vlcj.player.VideoMetaData;
-import uk.co.caprica.vlcj.player.embedded.*;
-import uk.co.caprica.vlcj.runtime.RuntimeUtil;
-import uk.co.caprica.vlcj.runtime.windows.WindowsRuntimeUtil;
-
-//basic class of a videoplayer for one video
-public class SimpleVideoPlayer extends JFrame implements MediaPlayerEventListener, WindowListener{
-    private EmbeddedMediaPlayer mp;
-    private Timer t;
-    private JPanel screenPanel,controlsPanel;
-    private JSlider timeline;
-    private JButton play,back,forward;
-    private JToggleButton loop,mute;
-    private JSlider speed;
-    private Canvas scr;
-    private final String[] mediaOptions = {""};
-    private boolean syncTimeline=false;
-    private boolean looping=false;
-    private SimpleDateFormat ms;
-    private static final Logger LOG = Logger.getLogger(MediaPlayerFactory.class);
-    private int jumpLength=1000;
-    private int  loopLength=6000;
-    private static Set<VideoObserver> observers = new HashSet<VideoObserver>(); //we have to implement our own Observer pattern
-    
-    public SimpleVideoPlayer() {
-        super();
-        try
-        {
-        	//some workarounds to detect libVLC and DNA on windows        
-        	if(RuntimeUtil.isWindows()) {
-        		System.setProperty("jna.library.path",WindowsRuntimeUtil.getVlcInstallDir());  //FIXME doesn't work even with this workaround!
-            }
-        	System.setProperty("logj4.configuration","file:log4j.xml"); //TODO still unsure if we can't link this to the JOSM log4j instance        	        
-            //we don't need any options
-            String[] libvlcArgs = {""};
-            String[] standardMediaOptions = {""};
-            //System.out.println("libvlc version: " + LibVlc.INSTANCE.libvlc_get_version());
-            //setup Media Player
-            //TODO we have to deal with unloading things again ....
-            MediaPlayerFactory mediaPlayerFactory = new MediaPlayerFactory(libvlcArgs);
-            FullScreenStrategy fullScreenStrategy = new DefaultFullScreenStrategy(this);
-            mp = mediaPlayerFactory.newMediaPlayer(fullScreenStrategy);
-            mp.setStandardMediaOptions(standardMediaOptions);
-            //setup GUI
-            setSize(400, 300); //later we apply movie size
-            setAlwaysOnTop(true);
-            createUI();
-            setLayout();
-            addListeners(); //registering shortcuts is task of the outer plugin class!
-            //embed vlc player
-            scr.setVisible(true);
-            setVisible(true);
-            mp.setVideoSurface(scr);
-            mp.addMediaPlayerEventListener(this);
-            //mp.pause();
-            //jump(0);
-            //create updater
-            ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
-            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, 500L, TimeUnit.MILLISECONDS);
-            //setDefaultCloseOperation(EXIT_ON_CLOSE);
-            addWindowListener(this);
-        }
-        catch (NoClassDefFoundError e)
-        {
-            System.err.println(tr("Unable to find JNA Java library!"));
-        }
-        catch (UnsatisfiedLinkError e)
-        {
-            System.err.println(tr("Unable to find native libvlc library!"));
-        }
-        
-    }
-
-    private void createUI() {
-        //setIconImage();
-        ms = new SimpleDateFormat("hh:mm:ss");
-        scr=new Canvas();
-        timeline = new JSlider(0,100,0);
-        timeline.setMajorTickSpacing(10);
-        timeline.setMajorTickSpacing(5);
-        timeline.setPaintTicks(true);
-        //TODO we need Icons instead
-        play= new JButton(tr("play"));
-        back= new JButton("<");
-        forward= new JButton(">");
-        loop= new JToggleButton(tr("loop"));
-        mute= new JToggleButton(tr("mute"));
-        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);
-    }
-    
-    //creates a layout like the most mediaplayers are...
-    private void setLayout() {
-        this.setLayout(new BorderLayout());
-        screenPanel=new JPanel();
-        screenPanel.setLayout(new BorderLayout());
-        controlsPanel=new JPanel();
-        controlsPanel.setLayout(new FlowLayout());
-        add(screenPanel,BorderLayout.CENTER);
-        add(controlsPanel,BorderLayout.SOUTH);
-        //fill screen panel
-        screenPanel.add(scr,BorderLayout.CENTER);
-        screenPanel.add(timeline,BorderLayout.SOUTH);
-        screenPanel.add(speed,BorderLayout.EAST);
-        controlsPanel.add(play);
-        controlsPanel.add(back);
-        controlsPanel.add(forward);
-        controlsPanel.add(loop);
-        controlsPanel.add(mute);
-        loop.setSelected(false);
-        mute.setSelected(false);
-    }
-
-    //add UI functionality
-    private void addListeners() {
-        timeline.addChangeListener(new ChangeListener() {
-            public void stateChanged(ChangeEvent e) {
-                if(!syncTimeline) //only if user moves the slider by hand
-                {
-                    if(!timeline.getValueIsAdjusting()) //and the slider is fixed
-                    {
-                        //recalc to 0.x percent value
-                        mp.setPosition((float)timeline.getValue()/100.0f);
-                    }                   
-                }
-            }
-            });
-        
-        play.addActionListener(new ActionListener() {
-            
-            public void actionPerformed(ActionEvent arg0) {
-                if(mp.isPlaying()) mp.pause(); else mp.play();              
-            }
-        });
-        
-        back.addActionListener(new ActionListener() {
-            
-            public void actionPerformed(ActionEvent arg0) {
-                backward();
-            }
-        });
-        
-        forward.addActionListener(new ActionListener() {
-            
-            public void actionPerformed(ActionEvent arg0) {
-                forward();
-            }
-        });
-        
-        loop.addActionListener(new ActionListener() {
-
-            public void actionPerformed(ActionEvent arg0) {
-                loop();
-            }
-        });
-        
-        mute.addActionListener(new ActionListener() {
-
-            public void actionPerformed(ActionEvent arg0) {
-                mute();
-            }
-        });
-        
-        speed.addChangeListener(new ChangeListener() {
-            
-            public void stateChanged(ChangeEvent arg0) {
-                if(!speed.getValueIsAdjusting()&&(mp.isPlaying()))
-                {
-                    int perc = speed.getValue();
-                    float ratio= (float) (perc/400f*1.75);
-                    ratio=ratio+(9/8);
-                    mp.setRate(ratio);
-                }
-                
-            }
-        });
-        
-    }   
-
-    public void finished(MediaPlayer arg0) {
-            
-    }
-
-    public void lengthChanged(MediaPlayer arg0, long arg1) {
-
-    }
-
-    public void metaDataAvailable(MediaPlayer arg0, VideoMetaData data) {
-        final float perc = 0.5f;
-        Dimension org=data.getVideoDimension();
-        scr.setSize(new Dimension((int)(org.width*perc), (int)(org.height*perc)));
-        pack();
-        //send out metadatas to all observers
-        for (VideoObserver o : observers) {
-            o.metadata(0, hasSubtitles());
-        }
-    }
-
-    public void paused(MediaPlayer arg0) {
-
-    }
-
-    public void playing(MediaPlayer arg0) {
-
-    }
-
-    public void positionChanged(MediaPlayer arg0, float arg1) {
-        
-    }
-
-    public void stopped(MediaPlayer arg0) {
-                
-    }
-
-    public void timeChanged(MediaPlayer arg0, long arg1) {
-
-    }
-    
-
-    public void windowActivated(WindowEvent arg0) { }
-
-    public void windowClosed(WindowEvent arg0) {    }
-
-    //we have to unload and disconnect to the VLC engine
-    public void windowClosing(WindowEvent evt) {
-        if(LOG.isDebugEnabled()) {LOG.debug("windowClosing(evt=" + evt + ")");}
-        pause();
-        //FIXME stop timers etc.
-        mp.release();
-        mp = null;
-      }
-
-    public void windowDeactivated(WindowEvent arg0) {   }
-
-    public void windowDeiconified(WindowEvent arg0) {   }
-
-    public void windowIconified(WindowEvent arg0) { }
-
-    public void windowOpened(WindowEvent arg0) {    }   
-    
-    public void setFile(File f)
-    {
-        String mediaPath = f.getAbsoluteFile().toString();
-        mp.playMedia(mediaPath, mediaOptions);
-        pack(); 
-    }
-    
-    public void play()
-    {
-        mp.play();
-    }
-    
-    public void jump(long time)
-    {
-        /*float pos = (float)mp.getLength()/(float)time;
-        mp.setPosition(pos);*/
-        mp.setTime(time);
-    }
-    
-    public long getTime()
-    {
-        return mp.getTime();
-    }
-    
-    public float getPosition()
-    {
-        return mp.getPosition();
-    }
-    
-    public boolean isPlaying()
-    {
-        return mp.isPlaying();
-    }
-    
-    //gets called by the Syncer thread to update all observers
-    public void updateTime ()
-    {
-        if(mp.isPlaying())
-        {
-        	long millis=mp.getTime();
-        	String s = String.format("%02d:%02d:%02d", //dont know why normal Java date utils doesn't format the time right
-		      TimeUnit.MILLISECONDS.toHours(millis),
-		      TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), 
-		      TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
-		    );
-            //setTitle(ms.format(new Time(sec)));
-        	setTitle(s);
-            syncTimeline=true;
-            timeline.setValue(Math.round(mp.getPosition()*100));
-            syncTimeline=false;
-            notifyObservers(mp.getTime());
-        }
-    }
-    
-    //allow externals to extend the ui
-    public void addComponent(JComponent c)
-    {
-        controlsPanel.add(c);
-        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() {
-        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;
-            }
-        
-    }
-    
-    protected void mute() {
-        mp.mute();
-        
-    }
-
-    public void forward() {
-        mp.setTime((long) (mp.getTime()+jumpLength));
-    }
-
-    public void backward() {
-        mp.setTime((long) (mp.getTime()-jumpLength));
-        
-    }
-
-    public void removeVideo() {
-        if (mp.isPlaying()) mp.stop();
-        mp.release();
-        
-    }
-    
-    public void toggleSubs()
-    {
-        //vlc manages it's subtitles in a own list so we have to cycle trough
-        int spu = mp.getSpu();
-        if(spu > -1) {
-          spu++;
-          if(spu > mp.getSpuCount()) {
-            spu = -1;
-          }
-        }
-        else {
-          spu = 0;
-        }
-        mp.setSpu(spu);
-    }
-
-    public static void addObserver(VideoObserver observer) {
-
-            observers.add(observer);
-
-        }
-
-     
-
-        public static void removeObserver(VideoObserver observer) {
-
-            observers.remove(observer);
-
-        }
-
-        private static void notifyObservers(long newTime) {
-
-            for (VideoObserver o : observers) {
-                o.playing(newTime);
-            }
-
-        }
-
-        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();
-        }
-
-        public void error(MediaPlayer arg0) {
-            // TODO Auto-generated method stub
-            
-        }
-
-        public void mediaChanged(MediaPlayer arg0) {
-            // TODO Auto-generated method stub
-            
-        }
-
-        public boolean hasSubtitles() {
-            if (mp.getSpuCount()==0) return false; else   return true;
-        }
-
-		public void backward(MediaPlayer arg0) {
-			// TODO Auto-generated method stub
-			
-		}
-
-		public void buffering(MediaPlayer arg0) {
-			System.out.println("buffering!");
-			
-		}
-
-		public void forward(MediaPlayer arg0) {
-			// TODO Auto-generated method stub
-			
-		}
-
-		public void opening(MediaPlayer arg0) {
-			// TODO Auto-generated method stub
-			System.out.println("opening!");
-			
-		}
-
-		public void pausableChanged(MediaPlayer arg0, int arg1) {
-			// TODO Auto-generated method stub
-			
-		}
-
-		public void seekableChanged(MediaPlayer arg0, int arg1) {
-			System.out.println("seeking!");
-			
-		}
-
-		public void snapshotTaken(MediaPlayer arg0, String arg1) {
-			// TODO Auto-generated method stub
-			
-		}
-
-		public void titleChanged(MediaPlayer arg0, int arg1) {
-			// TODO Auto-generated method stub
-			
-		}
-
-    
-
-}
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 25755)
+++ 	(revision )
@@ -1,26 +1,0 @@
-package org.openstreetmap.josm.plugins.videomapping.video;
-
-import javax.swing.SwingUtilities;
-
-import uk.co.caprica.vlcj.player.MediaPlayer;
-
-//Syncs all UI components to the playback using the SWING thread
-final class Syncer implements Runnable {
-
-    private final SimpleVideoPlayer pl;
-    
-    Syncer(SimpleVideoPlayer pl) {
-      this.pl = pl;
-    }
-    
-
-    public void run() {
-      SwingUtilities.invokeLater(new Runnable() {
-          //here we update
-        public void run() {
-            if (pl.isPlaying()) pl.updateTime(); //if the video is seeking we get a mess
-        }
-      });
-      
-    }
-  }
Index: applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/Video.java
===================================================================
--- applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/Video.java	(revision 25765)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/Video.java	(revision 25765)
@@ -0,0 +1,19 @@
+package org.openstreetmap.josm.plugins.videomapping.video;
+
+import java.awt.Canvas;
+import java.io.File;
+
+import uk.co.caprica.vlcj.player.MediaPlayer;
+
+public class Video {
+	public File filename;
+	public MediaPlayer player;
+	public Canvas canvas;
+	
+	public Video(File filename, Canvas canvas) {
+		this.filename=filename;
+		this.canvas=canvas;
+	}
+	
+
+}
Index: applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideoEngine.java
===================================================================
--- applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideoEngine.java	(revision 25765)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideoEngine.java	(revision 25765)
@@ -0,0 +1,308 @@
+package org.openstreetmap.josm.plugins.videomapping.video;
+
+import java.awt.Canvas;
+import java.awt.Dimension;
+import java.awt.Window;
+import java.io.File;
+import java.util.LinkedList;
+import java.util.List;
+
+import com.sun.jna.NativeLibrary;
+
+import uk.co.caprica.vlcj.binding.internal.libvlc_media_player_t;
+import uk.co.caprica.vlcj.player.MediaPlayer;
+import uk.co.caprica.vlcj.player.MediaPlayerEventListener;
+import uk.co.caprica.vlcj.player.MediaPlayerFactory;
+import uk.co.caprica.vlcj.player.VideoMetaData;
+import uk.co.caprica.vlcj.player.embedded.DefaultFullScreenStrategy;
+import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
+import uk.co.caprica.vlcj.player.embedded.FullScreenStrategy;
+import uk.co.caprica.vlcj.runtime.windows.WindowsCanvas;
+import uk.co.caprica.vlcj.runtime.windows.WindowsRuntimeUtil;
+
+import static org.openstreetmap.josm.tools.I18n.*;
+
+//concrete Player library that is able to play back multiple videos
+public class VideoEngine implements MediaPlayerEventListener{
+	private FullScreenStrategy fullScreenStrategy;
+	private MediaPlayerFactory mediaPlayerFactory;
+	private List<Video> videos;
+	private List<VideosObserver> observers;
+	private final String[] libvlcArgs = {""};
+    private final String[] standardMediaOptions = {""};
+    private final String[] deinterlacers = {"bob","linear"};
+    private final float initialCanvasFactor = 0.5f;
+	
+	//called at plugin start to setup library
+	public static void setupPlayer()
+	{
+		NativeLibrary.addSearchPath("libvlc", WindowsRuntimeUtil.getVlcInstallDir());
+	}
+	
+	public VideoEngine(Window parent)
+	{
+		System.setProperty("logj4.configuration","file:log4j.xml"); //TODO still unsure if we can't link this to the JOSM log4j instance
+		videos = new LinkedList<Video>();
+		observers = new LinkedList<VideosObserver>();
+		try
+		{
+			mediaPlayerFactory = new MediaPlayerFactory(libvlcArgs);
+	        fullScreenStrategy = new DefaultFullScreenStrategy(parent);
+		}
+		catch (NoClassDefFoundError e)
+        {
+            System.err.println(tr("Unable to find JNA Java library!"));
+        }
+        catch (UnsatisfiedLinkError e)
+        {
+            System.err.println(tr("Unable to find native libvlc library!"));
+        }        
+	}
+	
+	public void add(Video video)
+	{
+		try
+		{
+			EmbeddedMediaPlayer mp;
+			mp = mediaPlayerFactory.newMediaPlayer(fullScreenStrategy);
+			video.player=mp;
+			mp.setStandardMediaOptions(standardMediaOptions);
+			videos.add(video);
+			mp.setVideoSurface(video.canvas);
+	        mp.addMediaPlayerEventListener(this);
+	        String mediaPath = video.filename.getAbsoluteFile().toString();
+	        mp.playMedia(mediaPath); 
+	        //now fetching and playback starts automatically			
+		}
+		catch (NoClassDefFoundError e)
+        {
+            System.err.println(tr("Unable to find JNA Java library!"));
+        }
+        catch (UnsatisfiedLinkError e)
+        {
+            System.err.println(tr("Unable to find native libvlc library!"));
+        }
+	}
+	
+	public void play()
+	{
+		for (Video video : videos) {
+			video.player.play();
+		}
+		System.out.println("abspielen");
+	}
+	
+	public void pause()
+	{
+		for (Video video : videos) {
+			video.player.pause();
+		}
+	}
+	
+	//jumps relative for ms in all videos
+	public void jump(long ms) {
+		for (Video video : videos) {
+			long start=video.player.getTime();
+			video.player.setTime(start+ms);
+		}
+		
+	}
+
+	//jumps in all videos to this absolute video time
+	public void jumpTo(long msVideo)
+	{
+		for (Video video : videos) {
+			video.player.setTime(msVideo);
+		}
+		notifyObservers(VideoObserversEvents.jumping);
+	}
+			
+	//TODO muss auf Rückgabe für alle Videos erweitert werden
+	public long getCurrentVideoTime()
+	{
+		return videos.get(0).player.getTime();
+	}
+	
+	//jumps in all videos to this absolute video time percentage
+	public void jumpToPosition(int percent)
+	{
+		for (Video video : videos) {
+			float position = ((float)percent/100f);
+			video.player.setPosition(position);
+		}
+		notifyObservers(VideoObserversEvents.jumping);
+	}
+	
+	public int getPosition()
+	{
+		return (int) (videos.get(0).player.getPosition()*100);
+	}
+	
+	
+	
+	public void setSpeed(int percent)
+	{
+		for (Video video : videos) {
+			video.player.setRate((float)(percent/100f));
+		}
+		notifyObservers(VideoObserversEvents.speeding);
+	}
+	
+	public int getSpeed()
+	{
+		return (int) (videos.get(0).player.getRate()*100);
+	}
+	
+	//returns if at least one video has subtitles
+	public boolean hasSubtitles()
+	{
+		for (Video video : videos) {
+			if (video.player.getSpuCount()>0) return true;
+		}
+		return false;
+	}
+	
+	
+	public void setSubtitles (boolean enabled)
+	{
+		if (enabled)
+		{
+			//VLC uses a list of sub picture units
+			for (Video video : videos) {
+				video.player.setSpu(0);
+			}
+		}
+		else
+		{
+			for (Video video : videos) {
+				video.player.setSpu(-1);
+			}
+		}
+	}
+		
+	
+	public void setDeinterlacer (String deinterlacer)
+	{
+		for (Video video : videos) {
+			video.player.setDeinterlace(deinterlacer);
+		}
+	}
+	
+	public String[] getDeinterlacers()
+	{
+		return deinterlacers;
+	}
+	
+	public void mute()
+	{
+		for (Video video : videos) {
+			video.player.mute();
+		}
+	}
+	
+	public void unload()
+	{
+		for (Video video : videos) {
+			video.player.stop();
+			video.player.release();
+			video.player=null;
+			video.canvas=null;
+		}
+		mediaPlayerFactory.release();        
+	}
+
+	public void backward(MediaPlayer arg0) {
+		
+	}
+
+	public void buffering(MediaPlayer arg0) {
+		
+	}
+
+	public void error(MediaPlayer arg0) {
+		
+	}
+
+	public void finished(MediaPlayer arg0) {
+		
+	}
+
+	public void forward(MediaPlayer arg0) {
+		
+	}
+
+	public void lengthChanged(MediaPlayer arg0, long arg1) {
+		
+	}
+
+	public void mediaChanged(MediaPlayer arg0) {
+		
+	}
+
+	public void metaDataAvailable(MediaPlayer mp, VideoMetaData data) {
+		Dimension org=data.getVideoDimension();
+		getVideo(mp).canvas.setSize(new Dimension((int)(org.width*initialCanvasFactor), (int)(org.height*initialCanvasFactor)));
+		notifyObservers(VideoObserversEvents.resizing);		
+	}
+
+	public void opening(MediaPlayer arg0) {
+		
+	}
+
+	public void pausableChanged(MediaPlayer arg0, int arg1) {
+		
+	}
+
+	public void paused(MediaPlayer arg0) {
+			
+	}
+
+	public void playing(MediaPlayer arg0) {
+		
+	}
+
+	public void positionChanged(MediaPlayer arg0, float arg1) {
+		
+	}
+
+	public void seekableChanged(MediaPlayer arg0, int arg1) {
+		
+	}
+
+	public void snapshotTaken(MediaPlayer arg0, String arg1) {
+		
+	}
+
+	public void stopped(MediaPlayer arg0) {
+		
+	}
+
+	public void timeChanged(MediaPlayer arg0, long arg1) {
+		
+	}
+
+	public void titleChanged(MediaPlayer arg0, int arg1) {
+		
+	}
+	
+	private Video getVideo(MediaPlayer mp)
+	{
+		for (Video video : videos) {
+			if (video.player==mp) return video;
+		}
+		return null;
+	}
+	
+	private void notifyObservers(VideoObserversEvents event)
+	{
+		for (VideosObserver observer : observers) {
+			observer.update(event);
+		}
+	}
+
+	public void addObserver(VideosObserver observer) {
+		observers.add(observer);
+		
+	}
+
+}
Index: applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideoObserversEvents.java
===================================================================
--- applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideoObserversEvents.java	(revision 25765)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideoObserversEvents.java	(revision 25765)
@@ -0,0 +1,8 @@
+package org.openstreetmap.josm.plugins.videomapping.video;
+
+public enum VideoObserversEvents {
+	resizing,
+	speeding,
+	jumping
+
+}
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 25765)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideoPlayer.java	(revision 25765)
@@ -0,0 +1,352 @@
+package org.openstreetmap.josm.plugins.videomapping.video;
+import java.awt.Adjustable;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.helpers.DateTimeDateFormat;
+
+import java.awt.BorderLayout;
+import java.awt.Canvas;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.HeadlessException;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowListener;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.sql.Time;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Hashtable ;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.TimeZone;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+
+import javax.swing.Action;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+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.VideoObserver;
+import static org.openstreetmap.josm.tools.I18n.*;
+
+import uk.co.caprica.vlcj.binding.LibVlc;
+import uk.co.caprica.vlcj.player.MediaPlayer;
+import uk.co.caprica.vlcj.player.MediaPlayerEventAdapter;
+import uk.co.caprica.vlcj.player.MediaPlayerEventListener;
+import uk.co.caprica.vlcj.player.MediaPlayerFactory;
+import uk.co.caprica.vlcj.player.VideoMetaData;
+import uk.co.caprica.vlcj.player.embedded.*;
+import uk.co.caprica.vlcj.runtime.RuntimeUtil;
+import uk.co.caprica.vlcj.runtime.windows.WindowsRuntimeUtil;
+
+//basic class of a videoplayer for one video
+public class VideoPlayer extends JFrame implements WindowListener, VideosObserver, VideoPlayerObserver{
+	private static final int notificationIntervall = 1000;
+	private JPanel screenPanel,controlsPanel,canvasPanel;
+    private JSlider timeline;
+    private JButton play,back,forward;
+    private JToggleButton loop,mute;
+    private JSlider speed;
+    private DateFormat videoTimeFormat;
+    private VideoEngine videoengine;
+    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 void addVideo(File Videofile)
+	{
+		Video video = new Video(Videofile,new Canvas());
+		canvasPanel.add(video.canvas);
+		video.canvas.setSize(new Dimension(300, 300)); // will be updated by the video engine itself
+		videoengine.add(video);
+        pack();
+        startNotificationTimer();
+	}
+
+	protected void play() {
+		videoengine.play();
+		
+	}
+	
+	protected void pause(){
+		videoengine.pause();
+	}
+
+	protected void backward() {
+		videoengine.jump(-jumpLength);	
+	}
+
+	protected void forward() {
+		videoengine.jump(jumpLength);	
+	}
+
+	protected void toggleLooping() {
+		if(loopingTimer==null)
+		{
+			//do reset after loop time experienced
+			final long videoResetTime=(long) videoengine.getCurrentVideoTime()-loopLength/2;
+			TimerTask reset=new TimerTask() {                
+                @Override
+                public void run() {
+                    videoengine.jumpTo(videoResetTime);
+                }
+            };
+            loopingTimer= new Timer();
+            loopingTimer.schedule(reset,loopLength/2,loopLength);
+        }
+		else
+		{
+			loopingTimer.cancel();
+			loopingTimer=null;
+		}
+		
+	}
+
+	//create all normal player controls
+	private void createUI() {
+        //setIconImage();
+        timeline = new JSlider(0,100,0);
+        timeline.setMajorTickSpacing(5);
+        timeline.setMinorTickSpacing(1);
+        timeline.setPaintTicks(true);
+        play= new JButton(tr("play"));
+        back= new JButton("<");
+        forward= new JButton(">");
+        loop= new JToggleButton(tr("loop"));
+        mute= new JToggleButton(tr("mute"));
+        speed = new JSlider(0,200,100);
+        speed.setMajorTickSpacing(50);
+        speed.setPaintTicks(true);          
+        speed.setOrientation(Adjustable.VERTICAL);
+        Hashtable labelTable = new Hashtable ();
+        labelTable.put( new Integer( 100 ), new JLabel("1x") );
+        labelTable.put( new Integer( 50 ), new JLabel("-2x") );
+        labelTable.put( new Integer( 200 ), new JLabel("2x") );
+        speed.setLabelTable( labelTable );
+        speed.setPaintLabels(true);
+    }
+	
+	//puts all player controls to screen
+	private void addUI() {
+		//create layouts
+        this.setLayout(new BorderLayout());
+        screenPanel=new JPanel();
+        screenPanel.setLayout(new BorderLayout());
+        controlsPanel=new JPanel();
+        controlsPanel.setLayout(new FlowLayout());
+        canvasPanel=new JPanel();
+        canvasPanel.setLayout(new FlowLayout());
+        add(screenPanel,BorderLayout.CENTER);
+        add(controlsPanel,BorderLayout.SOUTH);
+        //fill screen panel
+        screenPanel.add(canvasPanel,BorderLayout.CENTER);
+        screenPanel.add(timeline,BorderLayout.SOUTH);
+        screenPanel.add(speed,BorderLayout.EAST);
+        controlsPanel.add(play);
+        controlsPanel.add(back);
+        controlsPanel.add(forward);
+        controlsPanel.add(loop);
+        controlsPanel.add(mute);
+        loop.setSelected(false);
+        mute.setSelected(false);
+    }
+	
+	//add UI functionality
+    private void addUIListeners() {        
+        
+        play.addActionListener(new ActionListener() {            
+            public void actionPerformed(ActionEvent arg0) {
+            pause();                
+            }
+        });
+        
+        back.addActionListener(new ActionListener() {
+            
+            public void actionPerformed(ActionEvent arg0) {
+                backward();
+            }
+        });
+        
+        forward.addActionListener(new ActionListener() {
+            
+            public void actionPerformed(ActionEvent arg0) {
+                forward();
+            }
+        });
+        
+        loop.addActionListener(new ActionListener() {
+
+            public void actionPerformed(ActionEvent arg0) {
+                toggleLooping();
+            }
+        });
+        
+        mute.addActionListener(new ActionListener() {
+
+            public void actionPerformed(ActionEvent arg0) {
+                videoengine.mute();
+            }
+        });
+        
+        timeline.addChangeListener(new ChangeListener() {
+            public void stateChanged(ChangeEvent e) {
+        		//skip events, fired by this sliede, one cycle ago            	
+            	if(!isManualJump)
+            	{
+	            	isManualJump=true;
+	            	videoengine.jumpToPosition((timeline.getValue()));
+            	}
+            }
+                
+        });
+        
+        speed.addChangeListener(new ChangeListener() {            
+            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 addObserver(VideoPlayerObserver observer)
+    {
+    	observers.add(observer);
+    }
+	
+	
+	private void startNotificationTimer() {
+		if(notificationTimer==null)
+		{
+			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
+		}
+	}
+
+	public void windowActivated(WindowEvent arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void windowClosed(WindowEvent arg0) {
+		
+	}
+
+	public void windowClosing(WindowEvent arg0) {	
+		videoengine.unload();
+	}
+
+	public void windowDeactivated(WindowEvent arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void windowDeiconified(WindowEvent arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void windowIconified(WindowEvent arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void windowOpened(WindowEvent arg0) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void update(VideoObserversEvents event) {
+		switch (event)
+		{		
+			case resizing:
+			{
+				pack();
+				break;
+			}
+			case speeding:
+			{
+				speed.setValue(videoengine.getSpeed());
+			}
+			case jumping:
+			{				
+			}
+		}		
+	}
+
+	//keep internal controls up to date during playback
+	public void update_plays() {
+		timeline.setValue(videoengine.getPosition());
+		System.out.println(videoengine.getPosition());
+		isManualJump=false;
+		
+	}
+    
+
+    
+
+}
Index: applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideoPlayerObserver.java
===================================================================
--- applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideoPlayerObserver.java	(revision 25765)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideoPlayerObserver.java	(revision 25765)
@@ -0,0 +1,5 @@
+package org.openstreetmap.josm.plugins.videomapping.video;
+
+public interface VideoPlayerObserver {
+	public void update_plays();
+}
Index: applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideosObserver.java
===================================================================
--- applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideosObserver.java	(revision 25765)
+++ applications/editors/josm/plugins/videomapping/src/org/openstreetmap/josm/plugins/videomapping/video/VideosObserver.java	(revision 25765)
@@ -0,0 +1,7 @@
+package org.openstreetmap.josm.plugins.videomapping.video;
+
+public interface VideosObserver {
+
+	void update(VideoObserversEvents event);
+
+}
Index: applications/editors/josm/plugins/videomapping/test/videotest.java
===================================================================
--- applications/editors/josm/plugins/videomapping/test/videotest.java	(revision 25755)
+++ applications/editors/josm/plugins/videomapping/test/videotest.java	(revision 25765)
@@ -5,4 +5,5 @@
 import java.awt.event.ActionListener;
 import java.io.File;
+import java.text.SimpleDateFormat;
 
 import javax.swing.JButton;
@@ -14,28 +15,19 @@
 import javax.swing.event.ChangeListener;
 
-import org.openstreetmap.josm.plugins.videomapping.video.SimpleVideoPlayer;
+import org.openstreetmap.josm.plugins.videomapping.video.VideoEngine;
+import org.openstreetmap.josm.plugins.videomapping.video.VideoPlayer;
 
 import uk.co.caprica.vlcj.player.*;
 
 
+//simple app to test videoplayer alone
 public class videotest {
-
-    /**
-     * @param args
-     */
     public static void main(String[] args) {
-        final SimpleVideoPlayer sVP = new SimpleVideoPlayer();
-        sVP.setFile(new File("C:\\TEMP\\122_0159.MOV"));
-        //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() {
-            
-            public void actionPerformed(ActionEvent e) {
-                sVP.jump(610000);               
-            }
-        });
-        sVP.add(b);
-        */
+    	VideoEngine.setupPlayer();
+    	VideoPlayer testplayer= new VideoPlayer(new SimpleDateFormat("hh:mm:ss"));
+    	testplayer.setJumpLength(1000);
+    	testplayer.setLoopLength(3000);
+    	testplayer.addVideo(new File("C:\\TEMP\\test.mpg"));
+        
     }
 
Index: applications/editors/josm/plugins/videomapping/uml/refactoring.uml
===================================================================
--- applications/editors/josm/plugins/videomapping/uml/refactoring.uml	(revision 25755)
+++ applications/editors/josm/plugins/videomapping/uml/refactoring.uml	(revision 25765)
@@ -42,6 +42,6 @@
   </packagedElement>
   <packagedElement xmi:type="uml:Class" xmi:id="_PlPfAFRsEeCQNNgUSH7L8A" name="GPSVideo">
+    <generalization xmi:id="_Chj2IFomEeClo8qtmvnTtw" general="_n4H5YFolEeClo8qtmvnTtw"/>
     <ownedAttribute xmi:id="_S4Pg0FRsEeCQNNgUSH7L8A" name="synced" aggregation="composite"/>
-    <ownedAttribute xmi:id="_TrDd0FRsEeCQNNgUSH7L8A" name="filepath" aggregation="composite"/>
     <ownedAttribute xmi:id="_UmDtgFRsEeCQNNgUSH7L8A" name="syncWP" aggregation="composite"/>
     <ownedAttribute xmi:id="_WVXvAFRsEeCQNNgUSH7L8A" name="syncVideoTime" aggregation="composite"/>
@@ -62,20 +62,17 @@
     <ownedOperation xmi:id="_Q_fIEFRvEeCQNNgUSH7L8A" name="operation3"/>
   </packagedElement>
-  <packagedElement xmi:type="uml:Class" xmi:id="_Zzy2UFRvEeCQNNgUSH7L8A" name="MediaPlayer">
+  <packagedElement xmi:type="uml:Class" xmi:id="_Zzy2UFRvEeCQNNgUSH7L8A" name="VideoPlayer" clientDependency="_OyCWkFqlEeC9SaX6k5fY1Q _VjNvcFqlEeC9SaX6k5fY1Q">
     <ownedAttribute xmi:id="_2wMrsFSlEeCQNNgUSH7L8A" name="logger" aggregation="composite"/>
     <ownedAttribute xmi:id="_oQVTYFSmEeCQNNgUSH7L8A" name="screenPanel" aggregation="composite"/>
     <ownedAttribute xmi:id="_pLfUEFSmEeCQNNgUSH7L8A" name="controlsPanel" aggregation="composite"/>
-    <ownedAttribute xmi:id="_SBMnYFVZEeCOu_gAbBroWQ" name="players" aggregation="composite"/>
-    <ownedOperation xmi:id="_b4aZcFRvEeCQNNgUSH7L8A" name="setupMediaPlayer">
-      <ownedParameter xmi:id="_fB4EwFRvEeCQNNgUSH7L8A" direction="return"/>
+    <ownedAttribute xmi:id="_J0hIEFtzEeCcNedtTKlFGg" name="jumpLength" aggregation="composite"/>
+    <ownedOperation xmi:id="_nSHcoFRvEeCQNNgUSH7L8A" name="loop">
+      <ownedParameter xmi:id="_n-OUsFRvEeCQNNgUSH7L8A" direction="return"/>
     </ownedOperation>
-    <ownedOperation xmi:id="_fStWEFRvEeCQNNgUSH7L8A" name="addFile">
-      <ownedParameter xmi:id="_gJGykFRvEeCQNNgUSH7L8A" direction="return"/>
+    <ownedOperation xmi:id="_iJa4IFSpEeCQNNgUSH7L8A" name="createUI">
+      <ownedParameter xmi:id="_jLlfwFSpEeCQNNgUSH7L8A" direction="return"/>
     </ownedOperation>
-    <ownedOperation xmi:id="_iEVJIFRvEeCQNNgUSH7L8A" name="play">
-      <ownedParameter xmi:id="_itT0sFRvEeCQNNgUSH7L8A" direction="return"/>
-    </ownedOperation>
-    <ownedOperation xmi:id="_i4CeAFRvEeCQNNgUSH7L8A" name="pause">
-      <ownedParameter xmi:id="_jPIvYFRvEeCQNNgUSH7L8A" direction="return"/>
+    <ownedOperation xmi:id="_OVaAEFRyEeCQNNgUSH7L8A" name="addFile">
+      <ownedParameter xmi:id="_O2fT4FRyEeCQNNgUSH7L8A" direction="return"/>
     </ownedOperation>
     <ownedOperation xmi:id="_jVP-cFRvEeCQNNgUSH7L8A" name="jumpForward">
@@ -84,32 +81,4 @@
     <ownedOperation xmi:id="_kYdH4FRvEeCQNNgUSH7L8A" name="jumpBackward">
       <ownedParameter xmi:id="_lK-J8FRvEeCQNNgUSH7L8A" direction="return"/>
-    </ownedOperation>
-    <ownedOperation xmi:id="_lSj_sFRvEeCQNNgUSH7L8A" name="jumpTo">
-      <ownedParameter xmi:id="_nK9rwFRvEeCQNNgUSH7L8A" direction="return"/>
-    </ownedOperation>
-    <ownedOperation xmi:id="_nSHcoFRvEeCQNNgUSH7L8A" name="loop">
-      <ownedParameter xmi:id="_n-OUsFRvEeCQNNgUSH7L8A" direction="return"/>
-    </ownedOperation>
-    <ownedOperation xmi:id="_oFrnkFRvEeCQNNgUSH7L8A" name="jumpToSynced">
-      <ownedParameter xmi:id="_pXChwFRvEeCQNNgUSH7L8A" direction="return"/>
-    </ownedOperation>
-    <ownedOperation xmi:id="_pdcrwFRvEeCQNNgUSH7L8A" name="operation"/>
-    <ownedOperation xmi:id="_qOxbAFRvEeCQNNgUSH7L8A" name="setSubtitles">
-      <ownedParameter xmi:id="_sINo4FRvEeCQNNgUSH7L8A" direction="return"/>
-    </ownedOperation>
-    <ownedOperation xmi:id="_qvaC4FRvEeCQNNgUSH7L8A" name="setSpeed">
-      <ownedParameter xmi:id="_rV2X0FRvEeCQNNgUSH7L8A" direction="return"/>
-    </ownedOperation>
-    <ownedOperation xmi:id="_sm6XEFRvEeCQNNgUSH7L8A" name="setDeinterlacer">
-      <ownedParameter xmi:id="_uJ2wgFRvEeCQNNgUSH7L8A" direction="return"/>
-    </ownedOperation>
-    <ownedOperation xmi:id="_J3w9AFSnEeCQNNgUSH7L8A" name="metaDataAvailable">
-      <ownedParameter xmi:id="_KdwmAFSnEeCQNNgUSH7L8A" direction="return"/>
-    </ownedOperation>
-    <ownedOperation xmi:id="_SLcDYFSnEeCQNNgUSH7L8A" name="mute">
-      <ownedParameter xmi:id="_TVWRwFSnEeCQNNgUSH7L8A" direction="return"/>
-    </ownedOperation>
-    <ownedOperation xmi:id="_iJa4IFSpEeCQNNgUSH7L8A" name="createUI">
-      <ownedParameter xmi:id="_jLlfwFSpEeCQNNgUSH7L8A" direction="return"/>
     </ownedOperation>
   </packagedElement>
@@ -134,13 +103,10 @@
     </ownedOperation>
   </packagedElement>
-  <packagedElement xmi:type="uml:Class" xmi:id="_MhLCUFRyEeCQNNgUSH7L8A" name="GPSMediaPlayer" clientDependency="_JJtsYFlWEeCTIL9CCJRwPw">
+  <packagedElement xmi:type="uml:Class" xmi:id="_MhLCUFRyEeCQNNgUSH7L8A" name="GPSVideoPlayer" clientDependency="_JJtsYFlWEeCTIL9CCJRwPw">
     <generalization xmi:id="_8RbsAFlNEeCTIL9CCJRwPw" general="_Zzy2UFRvEeCQNNgUSH7L8A"/>
     <ownedAttribute xmi:id="_YOwV0FVZEeCOu_gAbBroWQ" name="videos" aggregation="composite"/>
     <ownedAttribute xmi:id="_lBTl0FVaEeCOu_gAbBroWQ" name="syncPanel" aggregation="composite"/>
-    <ownedOperation xmi:id="_OVaAEFRyEeCQNNgUSH7L8A" name="addFile">
-      <ownedParameter xmi:id="_O2fT4FRyEeCQNNgUSH7L8A" direction="return"/>
-    </ownedOperation>
-    <ownedOperation xmi:id="_PA6bMFRyEeCQNNgUSH7L8A" name="createUI">
-      <ownedParameter xmi:id="_Qs9GQFRyEeCQNNgUSH7L8A" direction="return"/>
+    <ownedOperation xmi:id="_PA6bMFRyEeCQNNgUSH7L8A" name="extendUI">
+      <ownedParameter xmi:id="_KF0CkFqmEeC9SaX6k5fY1Q" direction="return"/>
     </ownedOperation>
     <ownedOperation xmi:id="_QynCUFRyEeCQNNgUSH7L8A" name="addSyncPoint">
@@ -150,11 +116,56 @@
       <ownedParameter xmi:id="_VyPlEFRyEeCQNNgUSH7L8A" direction="return"/>
     </ownedOperation>
-    <ownedOperation xmi:id="_V6St0FRyEeCQNNgUSH7L8A" name="rremoveFile">
-      <ownedParameter xmi:id="_XMsJ0FRyEeCQNNgUSH7L8A" direction="return"/>
+    <ownedOperation xmi:id="_V6St0FRyEeCQNNgUSH7L8A" name="removeFile">
+      <ownedParameter xmi:id="_HY1uIFomEeClo8qtmvnTtw" direction="return"/>
     </ownedOperation>
     <ownedOperation xmi:id="_YO2xcFRyEeCQNNgUSH7L8A" name="setAutoCenter">
       <ownedParameter xmi:id="_Y_u0wFRyEeCQNNgUSH7L8A" direction="return"/>
     </ownedOperation>
+    <ownedOperation xmi:id="_oFrnkFRvEeCQNNgUSH7L8A" name="jumpToSynced">
+      <ownedParameter xmi:id="_pXChwFRvEeCQNNgUSH7L8A" direction="return"/>
+    </ownedOperation>
   </packagedElement>
   <packagedElement xmi:type="uml:Dependency" xmi:id="_JJtsYFlWEeCTIL9CCJRwPw" name="n:1" supplier="_PlPfAFRsEeCQNNgUSH7L8A" client="_MhLCUFRyEeCQNNgUSH7L8A"/>
+  <packagedElement xmi:type="uml:Class" xmi:id="_zSPkMFnhEeClo8qtmvnTtw" name="VideoEngine">
+    <ownedAttribute xmi:id="_SBMnYFVZEeCOu_gAbBroWQ" name="players" aggregation="composite"/>
+    <ownedOperation xmi:id="_8dM34FnhEeClo8qtmvnTtw" name="operation"/>
+    <ownedOperation xmi:id="_b4aZcFRvEeCQNNgUSH7L8A" name="setupMediaPlayer">
+      <ownedParameter xmi:id="_fB4EwFRvEeCQNNgUSH7L8A" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_fStWEFRvEeCQNNgUSH7L8A" name="addFile">
+      <ownedParameter xmi:id="_gJGykFRvEeCQNNgUSH7L8A" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_iEVJIFRvEeCQNNgUSH7L8A" name="play">
+      <ownedParameter xmi:id="_itT0sFRvEeCQNNgUSH7L8A" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_i4CeAFRvEeCQNNgUSH7L8A" name="pause">
+      <ownedParameter xmi:id="_jPIvYFRvEeCQNNgUSH7L8A" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_lSj_sFRvEeCQNNgUSH7L8A" name="jumpTo">
+      <ownedParameter xmi:id="_nK9rwFRvEeCQNNgUSH7L8A" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_qOxbAFRvEeCQNNgUSH7L8A" name="setSubtitles">
+      <ownedParameter xmi:id="_sINo4FRvEeCQNNgUSH7L8A" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_qvaC4FRvEeCQNNgUSH7L8A" name="setSpeed">
+      <ownedParameter xmi:id="_rV2X0FRvEeCQNNgUSH7L8A" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_sm6XEFRvEeCQNNgUSH7L8A" name="setDeinterlacer">
+      <ownedParameter xmi:id="_uJ2wgFRvEeCQNNgUSH7L8A" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_J3w9AFSnEeCQNNgUSH7L8A" name="metaDataAvailable">
+      <ownedParameter xmi:id="_KdwmAFSnEeCQNNgUSH7L8A" direction="return"/>
+    </ownedOperation>
+    <ownedOperation xmi:id="_SLcDYFSnEeCQNNgUSH7L8A" name="mute">
+      <ownedParameter xmi:id="_TVWRwFSnEeCQNNgUSH7L8A" direction="return"/>
+    </ownedOperation>
+  </packagedElement>
+  <packagedElement xmi:type="uml:Class" xmi:id="_n4H5YFolEeClo8qtmvnTtw" name="Video">
+    <ownedAttribute xmi:id="_rEkAMFolEeClo8qtmvnTtw" name="canvas" aggregation="composite"/>
+    <ownedAttribute xmi:id="_TrDd0FRsEeCQNNgUSH7L8A" name="filepath" aggregation="composite"/>
+    <ownedAttribute xmi:id="_JD1QUFomEeClo8qtmvnTtw" name="player" aggregation="composite"/>
+  </packagedElement>
+  <packagedElement xmi:type="uml:Dependency" xmi:id="_OyCWkFqlEeC9SaX6k5fY1Q" supplier="_zSPkMFnhEeClo8qtmvnTtw" client="_Zzy2UFRvEeCQNNgUSH7L8A"/>
+  <packagedElement xmi:type="uml:Dependency" xmi:id="_VjNvcFqlEeC9SaX6k5fY1Q" supplier="_n4H5YFolEeClo8qtmvnTtw" client="_Zzy2UFRvEeCQNNgUSH7L8A"/>
+  <packagedElement xmi:type="uml:Interface" xmi:id="_6vSikFxoEeCd3KUH_BuVkA" name="VideoObserver"/>
 </uml:Package>
Index: applications/editors/josm/plugins/videomapping/uml/refactoring.umlclass
===================================================================
--- applications/editors/josm/plugins/videomapping/uml/refactoring.umlclass	(revision 25755)
+++ applications/editors/josm/plugins/videomapping/uml/refactoring.umlclass	(revision 25765)
@@ -77,5 +77,5 @@
     <styles xmi:type="notation:CanonicalStyle" xmi:id="_aKUcwVRrEeCQNNgUSH7L8A"/>
     <element xmi:type="uml:Class" href="refactoring.uml#_aDA64FRrEeCQNNgUSH7L8A"/>
-    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aKUcwlRrEeCQNNgUSH7L8A" x="255" y="270"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_aKUcwlRrEeCQNNgUSH7L8A" x="100" y="255"/>
   </children>
   <children xmi:type="notation:Shape" xmi:id="_Plrj4FRsEeCQNNgUSH7L8A" type="2001" fontName="Calibri">
@@ -89,8 +89,4 @@
         <layoutConstraint xmi:type="notation:Location" xmi:id="_S4ibwVRsEeCQNNgUSH7L8A"/>
       </children>
-      <children xmi:type="notation:Node" xmi:id="_TrWYwFRsEeCQNNgUSH7L8A" type="3001">
-        <element xmi:type="uml:Property" href="refactoring.uml#_TrDd0FRsEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_TrWYwVRsEeCQNNgUSH7L8A"/>
-      </children>
       <children xmi:type="notation:Node" xmi:id="_UmWocFRsEeCQNNgUSH7L8A" type="3001">
         <element xmi:type="uml:Property" href="refactoring.uml#_UmDtgFRsEeCQNNgUSH7L8A"/>
@@ -132,5 +128,5 @@
     <styles xmi:type="notation:CanonicalStyle" xmi:id="_Plrj4VRsEeCQNNgUSH7L8A"/>
     <element xmi:type="uml:Class" href="refactoring.uml#_PlPfAFRsEeCQNNgUSH7L8A"/>
-    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Plrj4lRsEeCQNNgUSH7L8A" x="460" y="500" width="166"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Plrj4lRsEeCQNNgUSH7L8A" x="465" y="505" width="166"/>
   </children>
   <children xmi:type="notation:Shape" xmi:id="_Z0FxQFRvEeCQNNgUSH7L8A" type="2001" fontName="Calibri">
@@ -152,7 +148,7 @@
         <layoutConstraint xmi:type="notation:Location" xmi:id="_pLy2EVSmEeCQNNgUSH7L8A"/>
       </children>
-      <children xmi:type="notation:Node" xmi:id="_SS7QkFVZEeCOu_gAbBroWQ" type="3001">
-        <element xmi:type="uml:Property" href="refactoring.uml#_SBMnYFVZEeCOu_gAbBroWQ"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_SS7QkVVZEeCOu_gAbBroWQ"/>
+      <children xmi:type="notation:Node" xmi:id="_J2KG0FtzEeCcNedtTKlFGg" type="3001">
+        <element xmi:type="uml:Property" href="refactoring.uml#_J0hIEFtzEeCcNedtTKlFGg"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_J2KG0VtzEeCcNedtTKlFGg"/>
       </children>
       <styles xmi:type="notation:TitleStyle" xmi:id="_Z0FxRlRvEeCQNNgUSH7L8A" showTitle="true"/>
@@ -162,63 +158,7 @@
     </children>
     <children xmi:type="notation:BasicCompartment" xmi:id="_Z0FxSlRvEeCQNNgUSH7L8A" type="7002">
-      <children xmi:type="notation:Node" xmi:id="_b4tUYFRvEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_b4aZcFRvEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_b4tUYVRvEeCQNNgUSH7L8A"/>
-      </children>
-      <children xmi:type="notation:Node" xmi:id="_fTA4EFRvEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_fStWEFRvEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_fTA4EVRvEeCQNNgUSH7L8A"/>
-      </children>
-      <children xmi:type="notation:Node" xmi:id="_iEe6IFRvEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_iEVJIFRvEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_iEe6IVRvEeCQNNgUSH7L8A"/>
-      </children>
-      <children xmi:type="notation:Node" xmi:id="_i4WAAFRvEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_i4CeAFRvEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_i4WAAVRvEeCQNNgUSH7L8A"/>
-      </children>
-      <children xmi:type="notation:Node" xmi:id="_jVZIYFRvEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_jVP-cFRvEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_jVZIYVRvEeCQNNgUSH7L8A"/>
-      </children>
-      <children xmi:type="notation:Node" xmi:id="_kYwC0FRvEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_kYdH4FRvEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_kYwC0VRvEeCQNNgUSH7L8A"/>
-      </children>
-      <children xmi:type="notation:Node" xmi:id="_lStwsFRvEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_lSj_sFRvEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_lStwsVRvEeCQNNgUSH7L8A"/>
-      </children>
       <children xmi:type="notation:Node" xmi:id="_nSa-oFRvEeCQNNgUSH7L8A" type="3002">
         <element xmi:type="uml:Operation" href="refactoring.uml#_nSHcoFRvEeCQNNgUSH7L8A"/>
         <layoutConstraint xmi:type="notation:Location" xmi:id="_nSa-oVRvEeCQNNgUSH7L8A"/>
-      </children>
-      <children xmi:type="notation:Node" xmi:id="_oF0xgFRvEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_oFrnkFRvEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_oF0xgVRvEeCQNNgUSH7L8A"/>
-      </children>
-      <children xmi:type="notation:Node" xmi:id="_pdvmsFRvEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_pdcrwFRvEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_pdvmsVRvEeCQNNgUSH7L8A"/>
-      </children>
-      <children xmi:type="notation:Node" xmi:id="_qO6k8FRvEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_qOxbAFRvEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_qO6k8VRvEeCQNNgUSH7L8A"/>
-      </children>
-      <children xmi:type="notation:Node" xmi:id="_qvjM0FRvEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_qvaC4FRvEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_qvjM0VRvEeCQNNgUSH7L8A"/>
-      </children>
-      <children xmi:type="notation:Node" xmi:id="_snNSAFRvEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_sm6XEFRvEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_snNSAVRvEeCQNNgUSH7L8A"/>
-      </children>
-      <children xmi:type="notation:Node" xmi:id="_J4D38FSnEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_J3w9AFSnEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_J4D38VSnEeCQNNgUSH7L8A"/>
-      </children>
-      <children xmi:type="notation:Node" xmi:id="_SLu-UFSnEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_SLcDYFSnEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_SLu-UVSnEeCQNNgUSH7L8A"/>
       </children>
       <children xmi:type="notation:Node" xmi:id="_iJtzEFSpEeCQNNgUSH7L8A" type="3002">
@@ -239,5 +179,5 @@
     <styles xmi:type="notation:CanonicalStyle" xmi:id="_Z0FxQVRvEeCQNNgUSH7L8A"/>
     <element xmi:type="uml:Class" href="refactoring.uml#_Zzy2UFRvEeCQNNgUSH7L8A"/>
-    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Z0FxQlRvEeCQNNgUSH7L8A" x="705" y="30"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Z0FxQlRvEeCQNNgUSH7L8A" x="725" y="290"/>
   </children>
   <children xmi:type="notation:Shape" xmi:id="_4MKRAFRxEeCQNNgUSH7L8A" type="2001" fontName="Calibri">
@@ -298,5 +238,5 @@
     <styles xmi:type="notation:CanonicalStyle" xmi:id="_4MKRAVRxEeCQNNgUSH7L8A"/>
     <element xmi:type="uml:Class" href="refactoring.uml#_4MAgAFRxEeCQNNgUSH7L8A"/>
-    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4MKRAlRxEeCQNNgUSH7L8A" x="280" y="540"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4MKRAlRxEeCQNNgUSH7L8A" x="115" y="515"/>
   </children>
   <children xmi:type="notation:Shape" xmi:id="_MhUzUFRyEeCQNNgUSH7L8A" type="2001" fontName="Calibri">
@@ -320,8 +260,4 @@
     </children>
     <children xmi:type="notation:BasicCompartment" xmi:id="_MhekVlRyEeCQNNgUSH7L8A" type="7002">
-      <children xmi:type="notation:Node" xmi:id="_OVs7AFRyEeCQNNgUSH7L8A" type="3002">
-        <element xmi:type="uml:Operation" href="refactoring.uml#_OVaAEFRyEeCQNNgUSH7L8A"/>
-        <layoutConstraint xmi:type="notation:Location" xmi:id="_OVs7AVRyEeCQNNgUSH7L8A"/>
-      </children>
       <children xmi:type="notation:Node" xmi:id="_PBEMMFRyEeCQNNgUSH7L8A" type="3002">
         <element xmi:type="uml:Operation" href="refactoring.uml#_PA6bMFRyEeCQNNgUSH7L8A"/>
@@ -343,4 +279,8 @@
         <element xmi:type="uml:Operation" href="refactoring.uml#_YO2xcFRyEeCQNNgUSH7L8A"/>
         <layoutConstraint xmi:type="notation:Location" xmi:id="_YPJsYVRyEeCQNNgUSH7L8A"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_oF0xgFRvEeCQNNgUSH7L8A" type="3002">
+        <element xmi:type="uml:Operation" href="refactoring.uml#_oFrnkFRvEeCQNNgUSH7L8A"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_oF0xgVRvEeCQNNgUSH7L8A"/>
       </children>
       <styles xmi:type="notation:TitleStyle" xmi:id="_MhekV1RyEeCQNNgUSH7L8A" showTitle="true"/>
@@ -357,5 +297,139 @@
     <styles xmi:type="notation:CanonicalStyle" xmi:id="_MhUzUVRyEeCQNNgUSH7L8A"/>
     <element xmi:type="uml:Class" href="refactoring.uml#_MhLCUFRyEeCQNNgUSH7L8A"/>
-    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_MhUzUlRyEeCQNNgUSH7L8A" x="705" y="460" width="146"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_MhUzUlRyEeCQNNgUSH7L8A" x="710" y="560" width="146"/>
+  </children>
+  <children xmi:type="notation:Shape" xmi:id="_zS1aEFnhEeClo8qtmvnTtw" type="2001" fontName="Calibri">
+    <children xmi:type="notation:DecorationNode" xmi:id="_zS1aE1nhEeClo8qtmvnTtw" type="5003">
+      <styles xmi:type="notation:FontStyle" xmi:id="_zS_LEFnhEeClo8qtmvnTtw" bold="true"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_zS1aFFnhEeClo8qtmvnTtw" type="5019"/>
+    <children xmi:type="notation:BasicCompartment" xmi:id="_zS1aFVnhEeClo8qtmvnTtw" type="7001">
+      <styles xmi:type="notation:TitleStyle" xmi:id="_zS1aFlnhEeClo8qtmvnTtw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_zS1aF1nhEeClo8qtmvnTtw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_zS1aGFnhEeClo8qtmvnTtw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_zS1aGVnhEeClo8qtmvnTtw"/>
+    </children>
+    <children xmi:type="notation:BasicCompartment" xmi:id="_zS1aGlnhEeClo8qtmvnTtw" type="7002">
+      <children xmi:type="notation:Node" xmi:id="_8dpj0FnhEeClo8qtmvnTtw" type="3002">
+        <element xmi:type="uml:Operation" href="refactoring.uml#_8dM34FnhEeClo8qtmvnTtw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_8dpj0VnhEeClo8qtmvnTtw"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_b4tUYFRvEeCQNNgUSH7L8A" type="3002">
+        <element xmi:type="uml:Operation" href="refactoring.uml#_b4aZcFRvEeCQNNgUSH7L8A"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_b4tUYVRvEeCQNNgUSH7L8A"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_fTA4EFRvEeCQNNgUSH7L8A" type="3002">
+        <element xmi:type="uml:Operation" href="refactoring.uml#_fStWEFRvEeCQNNgUSH7L8A"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_fTA4EVRvEeCQNNgUSH7L8A"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_iEe6IFRvEeCQNNgUSH7L8A" type="3002">
+        <element xmi:type="uml:Operation" href="refactoring.uml#_iEVJIFRvEeCQNNgUSH7L8A"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_iEe6IVRvEeCQNNgUSH7L8A"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_i4WAAFRvEeCQNNgUSH7L8A" type="3002">
+        <element xmi:type="uml:Operation" href="refactoring.uml#_i4CeAFRvEeCQNNgUSH7L8A"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_i4WAAVRvEeCQNNgUSH7L8A"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_lStwsFRvEeCQNNgUSH7L8A" type="3002">
+        <element xmi:type="uml:Operation" href="refactoring.uml#_lSj_sFRvEeCQNNgUSH7L8A"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_lStwsVRvEeCQNNgUSH7L8A"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_qO6k8FRvEeCQNNgUSH7L8A" type="3002">
+        <element xmi:type="uml:Operation" href="refactoring.uml#_qOxbAFRvEeCQNNgUSH7L8A"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_qO6k8VRvEeCQNNgUSH7L8A"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_qvjM0FRvEeCQNNgUSH7L8A" type="3002">
+        <element xmi:type="uml:Operation" href="refactoring.uml#_qvaC4FRvEeCQNNgUSH7L8A"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_qvjM0VRvEeCQNNgUSH7L8A"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_snNSAFRvEeCQNNgUSH7L8A" type="3002">
+        <element xmi:type="uml:Operation" href="refactoring.uml#_sm6XEFRvEeCQNNgUSH7L8A"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_snNSAVRvEeCQNNgUSH7L8A"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_J4D38FSnEeCQNNgUSH7L8A" type="3002">
+        <element xmi:type="uml:Operation" href="refactoring.uml#_J3w9AFSnEeCQNNgUSH7L8A"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_J4D38VSnEeCQNNgUSH7L8A"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_SLu-UFSnEeCQNNgUSH7L8A" type="3002">
+        <element xmi:type="uml:Operation" href="refactoring.uml#_SLcDYFSnEeCQNNgUSH7L8A"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_SLu-UVSnEeCQNNgUSH7L8A"/>
+      </children>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_zS1aG1nhEeClo8qtmvnTtw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_zS1aHFnhEeClo8qtmvnTtw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_zS1aHVnhEeClo8qtmvnTtw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_zS1aHlnhEeClo8qtmvnTtw"/>
+    </children>
+    <children xmi:type="notation:BasicCompartment" xmi:id="_zS1aH1nhEeClo8qtmvnTtw" type="7003">
+      <styles xmi:type="notation:TitleStyle" xmi:id="_zS1aIFnhEeClo8qtmvnTtw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_zS1aIVnhEeClo8qtmvnTtw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_zS1aIlnhEeClo8qtmvnTtw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_zS1aI1nhEeClo8qtmvnTtw"/>
+    </children>
+    <styles xmi:type="notation:CanonicalStyle" xmi:id="_zS1aEVnhEeClo8qtmvnTtw"/>
+    <element xmi:type="uml:Class" href="refactoring.uml#_zSPkMFnhEeClo8qtmvnTtw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_zS1aElnhEeClo8qtmvnTtw" x="485" y="30"/>
+  </children>
+  <children xmi:type="notation:Shape" xmi:id="_n5KbMFolEeClo8qtmvnTtw" type="2001" fontName="Calibri">
+    <children xmi:type="notation:DecorationNode" xmi:id="_n5KbM1olEeClo8qtmvnTtw" type="5003">
+      <styles xmi:type="notation:FontStyle" xmi:id="_n5KbRFolEeClo8qtmvnTtw" bold="true"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_n5KbNFolEeClo8qtmvnTtw" type="5019"/>
+    <children xmi:type="notation:BasicCompartment" xmi:id="_n5KbNVolEeClo8qtmvnTtw" type="7001">
+      <children xmi:type="notation:Node" xmi:id="_rFdYEFolEeClo8qtmvnTtw" type="3001">
+        <element xmi:type="uml:Property" href="refactoring.uml#_rEkAMFolEeClo8qtmvnTtw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_rFdYEVolEeClo8qtmvnTtw"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_TrWYwFRsEeCQNNgUSH7L8A" type="3001">
+        <element xmi:type="uml:Property" href="refactoring.uml#_TrDd0FRsEeCQNNgUSH7L8A"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_TrWYwVRsEeCQNNgUSH7L8A"/>
+      </children>
+      <children xmi:type="notation:Node" xmi:id="_JER8QFomEeClo8qtmvnTtw" type="3001">
+        <element xmi:type="uml:Property" href="refactoring.uml#_JD1QUFomEeClo8qtmvnTtw"/>
+        <layoutConstraint xmi:type="notation:Location" xmi:id="_JER8QVomEeClo8qtmvnTtw"/>
+      </children>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_n5KbNlolEeClo8qtmvnTtw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_n5KbN1olEeClo8qtmvnTtw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_n5KbOFolEeClo8qtmvnTtw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_n5KbOVolEeClo8qtmvnTtw"/>
+    </children>
+    <children xmi:type="notation:BasicCompartment" xmi:id="_n5KbOlolEeClo8qtmvnTtw" type="7002">
+      <styles xmi:type="notation:TitleStyle" xmi:id="_n5KbO1olEeClo8qtmvnTtw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_n5KbPFolEeClo8qtmvnTtw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_n5KbPVolEeClo8qtmvnTtw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_n5KbPlolEeClo8qtmvnTtw"/>
+    </children>
+    <children xmi:type="notation:BasicCompartment" xmi:id="_n5KbP1olEeClo8qtmvnTtw" type="7003">
+      <styles xmi:type="notation:TitleStyle" xmi:id="_n5KbQFolEeClo8qtmvnTtw" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_n5KbQVolEeClo8qtmvnTtw"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_n5KbQlolEeClo8qtmvnTtw"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_n5KbQ1olEeClo8qtmvnTtw"/>
+    </children>
+    <styles xmi:type="notation:CanonicalStyle" xmi:id="_n5KbMVolEeClo8qtmvnTtw"/>
+    <element xmi:type="uml:Class" href="refactoring.uml#_n4H5YFolEeClo8qtmvnTtw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_n5KbMlolEeClo8qtmvnTtw" x="510" y="355"/>
+  </children>
+  <children xmi:type="notation:Shape" xmi:id="_6v4_gFxoEeCd3KUH_BuVkA" type="2013" fontName="Calibri">
+    <children xmi:type="notation:DecorationNode" xmi:id="_6v4_glxoEeCd3KUH_BuVkA" type="5018"/>
+    <children xmi:type="notation:DecorationNode" xmi:id="_6v4_g1xoEeCd3KUH_BuVkA" type="5035"/>
+    <children xmi:type="notation:BasicCompartment" xmi:id="_6v4_hFxoEeCd3KUH_BuVkA" type="7029">
+      <styles xmi:type="notation:TitleStyle" xmi:id="_6v4_hVxoEeCd3KUH_BuVkA" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_6v4_hlxoEeCd3KUH_BuVkA"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_6v4_h1xoEeCd3KUH_BuVkA"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_6v4_iFxoEeCd3KUH_BuVkA"/>
+    </children>
+    <children xmi:type="notation:BasicCompartment" xmi:id="_6v4_iVxoEeCd3KUH_BuVkA" type="7030">
+      <styles xmi:type="notation:TitleStyle" xmi:id="_6v4_ilxoEeCd3KUH_BuVkA" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_6v4_i1xoEeCd3KUH_BuVkA"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_6v4_jFxoEeCd3KUH_BuVkA"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_6v4_jVxoEeCd3KUH_BuVkA"/>
+    </children>
+    <children xmi:type="notation:BasicCompartment" xmi:id="_6v4_jlxoEeCd3KUH_BuVkA" type="7031">
+      <styles xmi:type="notation:TitleStyle" xmi:id="_6v4_j1xoEeCd3KUH_BuVkA" showTitle="true"/>
+      <styles xmi:type="notation:SortingStyle" xmi:id="_6v4_kFxoEeCd3KUH_BuVkA"/>
+      <styles xmi:type="notation:FilteringStyle" xmi:id="_6v4_kVxoEeCd3KUH_BuVkA"/>
+      <styles xmi:type="notation:CanonicalStyle" xmi:id="_6v4_klxoEeCd3KUH_BuVkA"/>
+    </children>
+    <element xmi:type="uml:Interface" href="refactoring.uml#_6vSikFxoEeCd3KUH_BuVkA"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6v4_gVxoEeCd3KUH_BuVkA" x="773" y="118"/>
   </children>
   <styles xmi:type="notation:DiagramStyle" xmi:id="_Uz4jkVRrEeCQNNgUSH7L8A"/>
@@ -387,3 +461,39 @@
     <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_JJ3dYVlWEeCTIL9CCJRwPw" id="(1.0,0.3005464480874317)"/>
   </edges>
+  <edges xmi:type="notation:Connector" xmi:id="_Chj2IVomEeClo8qtmvnTtw" type="4001" source="_Plrj4FRsEeCQNNgUSH7L8A" target="_n5KbMFolEeClo8qtmvnTtw">
+    <children xmi:type="notation:DecorationNode" xmi:id="_Chj2JFomEeClo8qtmvnTtw" type="6018">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_Chj2JVomEeClo8qtmvnTtw" y="40"/>
+    </children>
+    <styles xmi:type="notation:FontStyle" xmi:id="_Chj2IlomEeClo8qtmvnTtw" fontName="Calibri"/>
+    <element xmi:type="uml:Generalization" href="refactoring.uml#_Chj2IFomEeClo8qtmvnTtw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Chj2I1omEeClo8qtmvnTtw" points="[-2, -33, 11, 58]$[14, -47, 27, 44]"/>
+    <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ChtAEFomEeClo8qtmvnTtw" id="(1.0,0.19760479041916168)"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_OyMHkFqlEeC9SaX6k5fY1Q" type="4002" source="_Z0FxQFRvEeCQNNgUSH7L8A" target="_zS1aEFnhEeClo8qtmvnTtw">
+    <children xmi:type="notation:DecorationNode" xmi:id="_OyMHlFqlEeC9SaX6k5fY1Q" type="6001">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_OyMHlVqlEeC9SaX6k5fY1Q" y="40"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_OyMHllqlEeC9SaX6k5fY1Q" type="6010">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_OyMHl1qlEeC9SaX6k5fY1Q" y="20"/>
+    </children>
+    <styles xmi:type="notation:RoutingStyle" xmi:id="_OyMHkVqlEeC9SaX6k5fY1Q"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_OyMHklqlEeC9SaX6k5fY1Q" fontName="Calibri"/>
+    <element xmi:type="uml:Dependency" href="refactoring.uml#_OyCWkFqlEeC9SaX6k5fY1Q"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_OyMHk1qlEeC9SaX6k5fY1Q" points="[-12, -1, 96, 4]$[-94, -4, 14, 1]"/>
+    <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_OyV4kFqlEeC9SaX6k5fY1Q" id="(0.11214953271028037,0.5298013245033113)"/>
+    <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_OyV4kVqlEeC9SaX6k5fY1Q" id="(0.9054054054054054,0.5254237288135594)"/>
+  </edges>
+  <edges xmi:type="notation:Edge" xmi:id="_VjhRcFqlEeC9SaX6k5fY1Q" type="4002" source="_Z0FxQFRvEeCQNNgUSH7L8A" target="_n5KbMFolEeClo8qtmvnTtw">
+    <children xmi:type="notation:DecorationNode" xmi:id="_VjhRdFqlEeC9SaX6k5fY1Q" type="6001">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_VjhRdVqlEeC9SaX6k5fY1Q" y="40"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_VjhRdlqlEeC9SaX6k5fY1Q" type="6010">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_VjhRd1qlEeC9SaX6k5fY1Q" y="20"/>
+    </children>
+    <styles xmi:type="notation:RoutingStyle" xmi:id="_VjhRcVqlEeC9SaX6k5fY1Q"/>
+    <styles xmi:type="notation:FontStyle" xmi:id="_VjhRclqlEeC9SaX6k5fY1Q" fontName="Calibri"/>
+    <element xmi:type="uml:Dependency" href="refactoring.uml#_VjNvcFqlEeC9SaX6k5fY1Q"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_VjhRc1qlEeC9SaX6k5fY1Q" points="[-3, 1, 165, -25]$[-160, -26, 8, -52]"/>
+    <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_VjqbYFqlEeC9SaX6k5fY1Q" id="(0.028037383177570093,0.6026490066225165)"/>
+  </edges>
 </notation:Diagram>
