Index: tmp/org.txm.backtomedia.feature/feature.xml
===================================================================
--- tmp/org.txm.backtomedia.feature/feature.xml	(revision 2444)
+++ tmp/org.txm.backtomedia.feature/feature.xml	(revision 2445)
@@ -79,4 +79,25 @@
          version="0.0.0"
          unpack="false"/>
 
+   <plugin
+         id="org.txm.libs.javafx.linux"
+         os="linux"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"/>
+
+   <plugin
+         id="org.txm.libs.javafx.macosx"
+         os="macosx"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"/>
+
+   <plugin
+         id="org.txm.libs.javafx.win32"
+         os="win32"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"/>
+
 </feature>
Index: tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/editors/vlcplayer/VLCPlayer.java
===================================================================
--- tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/editors/vlcplayer/VLCPlayer.java	(revision 2444)
+++ tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/editors/vlcplayer/VLCPlayer.java	(revision 2445)
@@ -6,6 +6,7 @@
 import java.io.File;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
+import java.util.concurrent.Semaphore;
 
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
@@ -26,13 +27,10 @@
 
 import com.sun.jna.StringArray;
 
-import uk.co.caprica.vlcj.binding.LibC;
-import uk.co.caprica.vlcj.binding.RuntimeUtil;
 import uk.co.caprica.vlcj.binding.internal.libvlc_instance_t;
 import uk.co.caprica.vlcj.factory.discovery.NativeDiscovery;
 import uk.co.caprica.vlcj.factory.discovery.strategy.NativeDiscoveryStrategy;
 import uk.co.caprica.vlcj.factory.swt.SwtMediaPlayerFactory;
-import uk.co.caprica.vlcj.media.MediaRef;
 import uk.co.caprica.vlcj.player.base.MediaPlayer;
 import uk.co.caprica.vlcj.player.base.MediaPlayerEventAdapter;
 import uk.co.caprica.vlcj.player.component.EmbeddedMediaPlayerComponent;
@@ -41,7 +39,7 @@
 import uk.co.caprica.vlcj.support.version.LibVlcVersion;
 import vlcplayerrcp.MessagesMP;
 
-public class VLCPlayer extends Composite {
+public class VLCPlayer extends Composite implements IPlayer {
 	
 	static { // force native libs discovery -> fix Mac OS X init
 		NativeDiscovery discovery = new NativeDiscovery() {
@@ -56,6 +54,7 @@
 				Log.finer("VLC NativeDiscovery: Not found.");
 			}
 		};
+		
 		boolean found = discovery.discover();
 		Log.finer("VLC NativeDiscovery: the discovery was succesfull ? " + found);
 		if (found) {
@@ -63,11 +62,13 @@
 			Log.finer("VLC NativeDiscovery: VLC instance is " + instance);
 			if (instance != null) {
 				libvlc_release(instance);
-			} else {
+			}
+			else {
 				Log.warning(NLS.bind("** Impossible to use your VLC [{0}] (please check that you have at least VLC version 3.0).", instance));
 			}
 			Log.finer("VLC NativeDiscovery: VLC version is " + new LibVlcVersion().getVersion());
-		} else {
+		}
+		else {
 			Log.warning("** Impossible to find VLC (please check that you have at least VLC version 3.0).");
 		}
 	}
@@ -129,6 +130,8 @@
 		return vlcPlayer;
 	}
 	
+	Semaphore s = new Semaphore(1);
+	
 	public VLCPlayer(Composite parent, int style) {
 		super(parent, style);
 		this.setLayout(new GridLayout(11, false));
@@ -158,9 +161,23 @@
 			
 			@Override
 			public void widgetDisposed(DisposeEvent e) {
-				vlcPlayer.controls().stop();
+				
+				
+				// vlcPlayer.submit(new Runnable() {
+				//
+				// @Override
+				// public void run() {
+				//
+				// }
+				// });
+				
+				// System.out.println("VLC STOP");
+				// vlcPlayer.controls().stop();
+				System.out.println("VLC RELEASE");
 				vlcPlayer.release();
+				System.out.println("FAC RELEASE");
 				factory.release();
+				// s.release();
 			}
 		});
 		
@@ -346,11 +363,13 @@
 			
 			@Override
 			public void opening(MediaPlayer mediaPlayer) {
+				if (videoComposite.isDisposed()) return;
 				Log.finer("Opening media...");
 			}
 			
 			@Override
 			public void finished(MediaPlayer mediaPlayer) {
+				if (videoComposite.isDisposed()) return;
 				Log.finer("Finished playing media...");
 				mediaPlayer.submit(new Runnable() {
 					
@@ -371,6 +390,7 @@
 			
 			@Override
 			public void timeChanged(MediaPlayer mediaPlayer, final long arg1) {
+				if (videoComposite.isDisposed()) return;
 				
 				mediaPlayer.submit(new Runnable() {
 					
@@ -411,6 +431,7 @@
 			
 			@Override
 			public void lengthChanged(MediaPlayer mediaPlayer, final long arg1) {
+				if (videoComposite.isDisposed()) return;
 				
 				mediaPlayer.submit(new Runnable() {
 					
@@ -498,13 +519,15 @@
 	 * @param time msec start time
 	 * @param endtime msec end time
 	 */
-	public void play(String mrl, int time, int endtime) {
+	@Override
+	public boolean play(String mrl, int time, int endtime) {
 		Log.fine(MessagesMP.bind(MessagesMP.playing, new Object[] { mrl, time, endtime }));
-		play(mrl, "" + time / 1000.0f, "" + endtime / 1000.0f); //$NON-NLS-1$ //$NON-NLS-2$
+		return play(mrl, "" + time / 1000.0f, "" + endtime / 1000.0f); //$NON-NLS-1$ //$NON-NLS-2$
 	}
 	
-	public void play(String mrl, int time) {
-		play(mrl, time, time);
+	@Override
+	public boolean play(String mrl, int time) {
+		return play(mrl, time, time);
 	}
 	
 	public void hideStopButton() {
@@ -515,12 +538,15 @@
 	
 	DateTimeFormatter hhmmssFormatter = DateTimeFormatter.ISO_LOCAL_TIME;
 	
+	private boolean authenticatedURLMode = false;
+	
 	/**
 	 * 
 	 * @param mrl
 	 * @param startTime "0.0" or ""hh:mm:ss" format
 	 * @param endTime "0.0" or ""hh:mm:ss" format
 	 */
+	@Override
 	public boolean play(String mrl, String startTime, String endTime) {
 		
 		if (startTime.matches("[0-9]+.[0-9]+")) {
@@ -546,18 +572,32 @@
 		// if (start == end) end = -1;
 		
 		Log.finer(MessagesMP.bind(MessagesMP.playing, new Object[] { mrl, startTime, endTime }));
-		// vlcPlayer.submit(new Runnable() {
-		//
-		// @Override
-		// public void run() {
+		
 		String[] options = { " :live-caching=200" }; // reduce video stream cache duration to 200ms
 		
 		Log.finer("Preparing media...");
-		if (!vlcPlayer.media().prepare(mrl, options)) {
-			Log.finer("** Impossible to prepare media.");
-			return false;
+		
+		// inserting login+mdp
+		String tmp = null;
+		if (authenticatedURLMode && mrl.contains("{0}") && mrl.contains("{1}")
+				&& System.getProperty(BackToMediaPreferences.MEDIA_AUTH_LOGIN) != null && System.getProperty(BackToMediaPreferences.MEDIA_AUTH_PASSWORD) != null) {
+			tmp = NLS.bind(mrl, System.getProperty(BackToMediaPreferences.MEDIA_AUTH_LOGIN), System.getProperty(BackToMediaPreferences.MEDIA_AUTH_PASSWORD));
 		}
 		
+		// use the patched URL if authenticatedURL is true
+		if (authenticatedURLMode && tmp != null) {
+			if (!vlcPlayer.media().prepare(tmp, options)) {
+				Log.finer("** Impossible to prepare media.");
+				return false;
+			}
+		}
+		else {
+			if (!vlcPlayer.media().prepare(mrl, options)) {
+				Log.finer("** Impossible to prepare media.");
+				return false;
+			}
+		}
+		
 		Log.finer("Is media valid ?");
 		if (!vlcPlayer.media().isValid()) {
 			Log.finer("** Invalid media.");
@@ -575,18 +615,31 @@
 		currentlyPlayed = mrl;
 		previouslyPlayed = mrl;
 		
-		playButton.setText(MessagesMP.pause);
+		if (!playButton.isDisposed()) {
+			playButton.setText(MessagesMP.pause);
+		}
 		firstLengthEvent = true;
-		// }
-		// });
+		
 		return true;
 	}
 	
+	/**
+	 * for more test use "player.getEmbeddedMediaPlayer()"
+	 * 
+	 * @return false if the media could not be loaded (file not found, access error...)
+	 */
+	@Override
+	public boolean isMediaLoaded() {
+		return getEmbeddedMediaPlayer().status().isPlayable();
+	}
+	
+	@Override
 	public void setRepeat(boolean repeat) {
 		this.repeat = repeat;
 		repeatButton.setSelection(repeat);
 	}
 	
+	@Override
 	public void stop() {
 		vlcPlayer.controls().stop();
 		currentlyPlayed = NOMEDIA;
@@ -594,4 +647,14 @@
 			playButton.setText(MessagesMP.play);
 		}
 	}
+	
+	@Override
+	public final void setCredentials(String login, String mdp) {
+		if (login != null && mdp != null) {
+			authenticatedURLMode = true;
+		}
+		else {
+			authenticatedURLMode = false;
+		}
+	}
 }
Index: tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/editors/vlcplayer/JFXPlayer.java
===================================================================
--- tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/editors/vlcplayer/JFXPlayer.java	(revision 0)
+++ tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/editors/vlcplayer/JFXPlayer.java	(revision 2445)
@@ -0,0 +1,741 @@
+package org.txm.backtomedia.editors.vlcplayer;
+
+import java.io.File;
+import java.net.Authenticator;
+import java.net.PasswordAuthentication;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.concurrent.Semaphore;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Scale;
+import org.txm.backtomedia.commands.function.TripleRangeSlider;
+import org.txm.backtomedia.preferences.BackToMediaPreferences;
+import org.txm.rcp.swt.GLComposite;
+import org.txm.utils.logger.Log;
+
+import javafx.beans.InvalidationListener;
+import javafx.beans.Observable;
+import javafx.embed.swt.FXCanvas;
+import javafx.scene.Group;
+import javafx.scene.Scene;
+import javafx.scene.media.Media;
+import javafx.scene.media.MediaPlayer;
+import javafx.scene.media.MediaPlayer.Status;
+import javafx.scene.media.MediaView;
+import javafx.scene.paint.Color;
+import javafx.util.Duration;
+import vlcplayerrcp.MessagesMP;
+
+public class JFXPlayer extends Composite implements IPlayer {
+	
+	protected static final String NOMEDIA = ""; //$NON-NLS-1$
+	
+	private MediaPlayer vlcPlayer;
+	
+	private GLComposite videoComposite;
+	
+	private Scale rateField;
+	
+	private Label rateValueLabel;
+	
+	private Scale volumeField;
+	
+	private Label volumeValueLabel;
+	
+	private Button playButton;
+	
+	private Button repeatButton;
+	
+	protected String currentlyPlayed = ""; //$NON-NLS-1$
+	
+	// private String startTime, endTime;
+	private int start, end;
+	
+	protected boolean hasEnded = false;
+	
+	private String previouslyPlayed = ""; //$NON-NLS-1$
+	
+	private boolean repeat = false;
+	
+	protected int volume = 100;
+	
+	private Button stopButton;
+	
+	Label timeLabel;
+	
+	TripleRangeSlider timeRange;
+	
+	boolean firstLengthEvent = true;
+	
+	long previous = 0;
+	
+	long time, mins, secs;
+	
+	public MediaPlayer getEmbeddedMediaPlayer() {
+		return vlcPlayer;
+	}
+	
+	Semaphore s = new Semaphore(1);
+	
+	private FXCanvas fxCanvas;
+	
+	Point previousP;
+	
+	protected boolean userStopped;
+	
+	public JFXPlayer(Composite parent, int style) {
+		super(parent, style);
+		this.setLayout(new GridLayout(11, false));
+		
+		// THE PLAYER
+		// if (RuntimeUtil.isMac()) {
+		// try {
+		// LibC.INSTANCE.setenv("VLC_PLUGIN_PATH", "/Applications/VLC.app/Contents/MacOS/plugins", 1);
+		// }
+		// catch (Exception ex) {
+		// ex.printStackTrace();
+		// }
+		// }
+		videoComposite = new GLComposite(this, SWT.NONE, "Video");
+		GridData gdata = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gdata.horizontalSpan = 11;
+		videoComposite.setLayoutData(gdata);
+		vlcPlayer = null;
+		
+		videoComposite.addDisposeListener(new DisposeListener() {
+			
+			@Override
+			public void widgetDisposed(DisposeEvent e) {
+				if (vlcPlayer != null) {
+					vlcPlayer.dispose();
+					vlcPlayer = null;
+					fxCanvas.setScene(null);
+				}
+			}
+		});
+		
+		fxCanvas = new FXCanvas(videoComposite, SWT.BORDER);
+		GridData gdata2 = new GridData(SWT.FILL, SWT.FILL, true, true);
+		fxCanvas.setLayoutData(gdata2);
+		
+		fxCanvas.addMouseListener(new MouseListener() {
+			
+			@Override
+			public void mouseUp(MouseEvent e) {
+				if (vlcPlayer != null) {
+					if (vlcPlayer.getStatus().equals(Status.PAUSED)) {
+						resume();
+					}
+					else if (vlcPlayer.getStatus().equals(Status.PLAYING)) {
+						pause();
+					}
+				}
+			}
+			
+			@Override
+			public void mouseDown(MouseEvent e) {}
+			
+			@Override
+			public void mouseDoubleClick(MouseEvent e) {}
+		});
+		
+		videoComposite.addListener(SWT.Resize, new Listener() {
+			
+			@Override
+			public void handleEvent(Event e) {
+				resizeView();
+			}
+		});
+		
+		// THE CONTROL BUTTONS
+		playButton = new Button(this, SWT.PUSH);
+		GridData playLayoutData = new GridData(SWT.FILL, SWT.CENTER, false, false);
+		playButton.setLayoutData(playLayoutData);
+		playButton.setText(MessagesMP.play);
+		playButton.addSelectionListener(new SelectionListener() {
+			
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				userStopped = false;
+				if (currentlyPlayed.length() == 0) {
+					selectMedia();
+					playButton.setText(MessagesMP.pause);
+				}
+				else if (vlcPlayer != null && vlcPlayer.getStatus().equals(Status.PLAYING)) {
+					pause();
+				}
+				else if (vlcPlayer != null && hasEnded) {
+					if (vlcPlayer == null) return;
+					replay();
+				}
+				else {
+					resume();
+				}
+			}
+			
+			@Override
+			public void widgetDefaultSelected(SelectionEvent e) {}
+		});
+		
+		// Button browseButton = new Button(this,SWT.PUSH);
+		// browseButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
+		// browseButton.setText("Open...");
+		// browseButton.addSelectionListener(new SelectionListener() {
+		// @Override
+		// public void widgetSelected(SelectionEvent e) {
+		// selectMedia();
+		// }
+		//
+		// @Override
+		// public void widgetDefaultSelected(SelectionEvent e) {}
+		// });
+		
+		stopButton = new Button(this, SWT.PUSH);
+		stopButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
+		stopButton.setText(MessagesMP.stop);
+		stopButton.addSelectionListener(new SelectionListener() {
+			
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (vlcPlayer != null) {
+					userStopped = true;
+					vlcPlayer.stop();
+				}
+			}
+			
+			@Override
+			public void widgetDefaultSelected(SelectionEvent e) {}
+		});
+		
+		timeLabel = new Label(this, SWT.NONE);
+		timeLabel.setText("00:00"); //$NON-NLS-1$
+		
+		timeRange = new TripleRangeSlider(this, SWT.None);
+		timeRange.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+		timeRange.setToolTipText(MessagesMP.time_range);
+		timeRange.addSelectionListener(new SelectionListener() {
+			
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				TripleRangeSlider.SELECTED_KNOB sk = timeRange.getLastSelectedKnob();
+				switch (sk) {
+					case UPPER:
+						end = timeRange.getUpperValue();
+						
+						vlcPlayer.setStopTime(Duration.seconds(end));
+						if (end < time) {
+							// System.out.println("Upper changed: fix time");
+							time = end;
+							vlcPlayer.seek(Duration.seconds(time));
+						}
+						break;
+					case LOWER:
+						start = timeRange.getLowerValue();
+						vlcPlayer.setStartTime(Duration.seconds(start));
+						if (start > time) {
+							// System.out.println("Lower changed: fix time");
+							time = start;
+							vlcPlayer.seek(Duration.seconds(time));
+						}
+						break;
+					case MIDDLE:
+						
+						time = timeRange.getMiddleValue();
+						// System.out.println("Middle changed: fix time: " + time);
+						
+						vlcPlayer.seek(Duration.seconds(time));
+						
+						break;
+					default:
+						// nothing
+				}
+				// System.out.println("time range: "+start+" -> "+end+" time="+time);
+			}
+			
+			@Override
+			public void widgetDefaultSelected(SelectionEvent e) {}
+		});
+		
+		repeatButton = new Button(this, SWT.CHECK);
+		repeatButton.setText(MessagesMP.repeat);
+		repeat = BackToMediaPreferences.getInstance().getBoolean(BackToMediaPreferences.REPEAT);
+		repeatButton.setSelection(repeat);
+		repeatButton.addSelectionListener(new SelectionListener() {
+			
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				repeat = repeatButton.getSelection();
+			}
+			
+			@Override
+			public void widgetDefaultSelected(SelectionEvent e) {}
+		});
+		
+		Label l = new Label(this, SWT.NONE);
+		l.setText(MessagesMP.rate);
+		
+		rateField = new Scale(this, SWT.BORDER);
+		GridData gdata4 = new GridData(SWT.FILL, SWT.CENTER, false, false);
+		gdata4.widthHint = 100;
+		rateField.setLayoutData(gdata4);
+		rateField.setMaximum(140);
+		rateField.setMinimum(70);
+		rateField.setSelection(100);
+		rateField.setPageIncrement(5);
+		
+		rateField.addSelectionListener(new SelectionListener() {
+			
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				float rate = rateField.getSelection() / 100.0f;
+				vlcPlayer.setRate(rate);
+				rateValueLabel.setText("" + rateField.getSelection() + "%");
+			}
+			
+			@Override
+			public void widgetDefaultSelected(SelectionEvent e) {}
+		});
+		
+		rateValueLabel = new Label(this, SWT.NONE);
+		rateValueLabel.setText("100%");//$NON-NLS-1$
+		
+		l = new Label(this, SWT.NONE);
+		l.setText(MessagesMP.volume);
+		
+		volumeField = new Scale(this, SWT.BORDER);
+		gdata4 = new GridData(SWT.FILL, SWT.CENTER, false, false);
+		gdata4.widthHint = 100;
+		volumeField.setLayoutData(gdata4);
+		volumeField.setMinimum(0);
+		volumeField.setMaximum(100);
+		volumeField.setSelection(volume);
+		volumeField.setPageIncrement(5);
+		volumeField.addSelectionListener(new SelectionListener() {
+			
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				vlcPlayer.setVolume(volumeField.getSelection());
+				volume = volumeField.getSelection();
+				volumeValueLabel.setText("" + volume + "%");
+			}
+			
+			@Override
+			public void widgetDefaultSelected(SelectionEvent e) {}
+		});
+		
+		volumeValueLabel = new Label(this, SWT.NONE);
+		volumeValueLabel.setText("100%");
+		
+		// vlcPlayer.events().addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
+		//
+		// @Override
+		// public void opening(MediaPlayer mediaPlayer) {
+		// if (videoComposite.isDisposed()) return;
+		// Log.finer("Opening media...");
+		// }
+		//
+		// @Override
+		// public void finished(MediaPlayer mediaPlayer) {
+		// if (videoComposite.isDisposed()) return;
+		// Log.finer("Finished playing media...");
+		// if (repeat) {
+		// replay();
+		// }
+		// else {
+		// hasEnded = true;
+		// }
+		// }
+		// });
+		
+		
+		//
+		// vlcPlayer.events().addMediaPlayerEventListener(new MediaPlayerEventAdapter() {
+		//
+		// @Override
+		// public void timeChanged(MediaPlayer mediaPlayer, final long arg1) {
+		//
+		// }
+		//
+		// @Override
+		// public void lengthChanged(MediaPlayer mediaPlayer, final long arg1) {
+		// if (videoComposite.isDisposed()) return;
+		//
+		// if (firstLengthEvent) {
+		// firstLengthEvent = false;
+		//
+		// // initialize time range widget limits
+		// timeRange.getDisplay().syncExec(new Runnable() {
+		//
+		// @Override
+		// public void run() {
+		// if (timeRange.isDisposed()) return;
+		// timeRange.setMaximum((int) arg1);
+		// // if (start == end) end = (int)arg1;
+		//
+		// if (end > 0 && start != end) {
+		// timeRange.setUpperValue(end);
+		// }
+		// else {
+		// timeRange.setUpperValue((int) arg1);
+		// }
+		//
+		// timeRange.setLowerValue(start);
+		// // System.out.println("Range: "+start+" -> "+end+" song length "+arg1);
+		// }
+		// });
+		// }
+		// }
+		// });
+	}
+	
+	protected void resizeView() {
+		if (view != null) {
+			Point p = videoComposite.getSize();
+			// if (previousP == null || (p.x != previousP.x && p.y != previousP.y)) { // ensure size changed
+			view.setFitHeight(p.y);
+			view.setFitWidth(p.x);
+			previousP = p;
+			// }
+		}
+	}
+	
+	protected void resume() {
+		if (vlcPlayer != null) {
+			vlcPlayer.play();
+			playButton.setText(MessagesMP.pause);
+		}
+	}
+	
+	protected void pause() {
+		if (vlcPlayer != null) {
+			vlcPlayer.pause();
+			playButton.setText(MessagesMP.resume);
+		}
+	}
+	
+	private void updateTimeLabel() {
+		mins = time / 60;
+		secs = (time) % 60;
+		timeLabel.setText(String.format("%02d:%02d", mins, secs)); //$NON-NLS-1$
+		timeLabel.update();
+	}
+	
+	protected void replay() {
+		if (currentlyPlayed.length() > 0) {
+			vlcPlayer.seek(Duration.seconds(start));
+			playButton.setText(MessagesMP.pause);
+		}
+	}
+	
+	protected void selectMedia() {
+		Log.fine(MessagesMP.select_file);
+		
+		FileDialog fd = new FileDialog(JFXPlayer.this.getShell(), SWT.OPEN);
+		fd.setText(MessagesMP.select_file_title);
+		File f = new File(previouslyPlayed);
+		if (f.isDirectory()) fd.setFilterPath(f.getPath());
+		else fd.setFilterPath(f.getParent());
+		
+		String[] filterExt = { "*.*", "*.mp3", "*.mp4", "*.avi" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+		fd.setFilterExtensions(filterExt);
+		String selected = fd.open();
+		if (selected == null) {
+			System.out.println(MessagesMP.cancel);
+			return;
+		}
+		
+		currentlyPlayed = selected;
+		previouslyPlayed = selected;
+		Log.fine(MessagesMP.opening + currentlyPlayed);
+		play(new File(currentlyPlayed).toURI().toString(), 0, 0);
+	}
+	
+	/**
+	 * 
+	 * @param mrl
+	 * @param time msec start time
+	 * @param endtime msec end time
+	 */
+	@Override
+	public boolean play(String mrl, int time, int endtime) {
+		Log.fine(MessagesMP.bind(MessagesMP.playing, new Object[] { mrl, time, endtime }));
+		return play(mrl, "" + time, "" + endtime); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+	
+	@Override
+	public boolean play(String mrl, int time) {
+		return play(mrl, time, time);
+	}
+	
+	public void hideStopButton() {
+		if (this.stopButton != null && !this.stopButton.isDisposed()) {
+			this.stopButton.dispose();
+		}
+	}
+	
+	DateTimeFormatter hhmmssFormatter = DateTimeFormatter.ISO_LOCAL_TIME;
+	
+	private MediaView view;
+	
+	private Group group;
+	
+	private Scene scene;
+	
+	private String mrl;
+	
+	private Media media;
+	
+	@Override
+	public final void setCredentials(String login, String mdp) {
+		Authenticator.setDefault(new Authenticator() {
+			
+			@Override
+			public PasswordAuthentication getPasswordAuthentication() {
+				// System.out.println("PA: login=" + login + " mdp=" + mdp + " mrl=" + mrl + " req=" + getRequestingHost());
+				if (login != null && mdp != null && mrl.contains("://" + getRequestingHost() + "/")) {
+					return new PasswordAuthentication(login, mdp.toCharArray());
+				}
+				return null;
+			}
+		});
+	}
+	
+	/**
+	 * 
+	 * @param mrl
+	 * @param startTime "0.0" or ""hh:mm:ss" format
+	 * @param endTime "0.0" or ""hh:mm:ss" format
+	 */
+	@Override
+	public boolean play(String mrl, String startTime, String endTime) {
+		
+		if (mrl.contains("{0}:{1}@")) {
+			mrl = mrl.replace("{0}:{1}@", "");
+		}
+		
+		this.mrl = mrl;
+		if (startTime.matches("[0-9]+.[0-9]+")) {
+			start = (int) (Float.parseFloat(startTime));
+		}
+		else if (startTime.matches("[0-9]+:[0-9]+:[0-9]+")) {
+			if (startTime.indexOf(":") == 1) {
+				startTime = "0" + startTime;
+			}
+			LocalTime time1 = LocalTime.parse(startTime, hhmmssFormatter);
+			start = ((time1.getHour() * 60 * 60) + (time1.getMinute() * 60) + time1.getSecond());
+		}
+		
+		if (endTime.matches("[0-9]+.[0-9]+")) {
+			end = (int) (Float.parseFloat(endTime));
+		}
+		else if (endTime.matches("[0-9]+:[0-9]+:[0-9]+")) {
+			if (endTime.indexOf(":") == 1) endTime = "0" + endTime;
+			LocalTime time1 = LocalTime.parse(endTime, hhmmssFormatter);
+			end = ((time1.getHour() * 60 * 60) + (time1.getMinute() * 60) + time1.getSecond());
+		}
+		
+		// if (start == end) end = -1;
+		
+		Log.finer(MessagesMP.bind(MessagesMP.playing, new Object[] { mrl, startTime, endTime }));
+		// vlcPlayer.submit(new Runnable() {
+		//
+		// @Override
+		// public void run() {
+		// String[] options = { " :live-caching=200" }; // reduce video stream cache duration to 200ms
+		
+		Log.finer("Preparing media...");
+		try {
+			javafx.application.Platform.setImplicitExit(false);
+			javafx.application.Platform.runLater(new Runnable() {
+				
+				@Override
+				public void run() {
+					Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
+						
+						@Override
+						public void uncaughtException(Thread t, Throwable e) {
+							System.out.println("JavaFX uncaught exception: " + e);
+						}
+					});
+				}
+			});
+			media = new Media(mrl);
+			vlcPlayer = new MediaPlayer(media);
+			
+			if (vlcPlayer.getError() == null) {
+				vlcPlayer.setOnError(new Runnable() {
+					
+					@Override
+					public void run() {
+						vlcPlayer.getError().printStackTrace();
+					}
+				});
+			}
+			else {
+				System.out.println("Warning: could not retrieve media error logger");
+			}
+			
+			initializePlayerListeners();
+			vlcPlayer.setAutoPlay(false);
+			
+			view = new MediaView(vlcPlayer);
+			
+			group = new Group(view);
+			
+			// scene = new Scene(group, Color.rgb(fxCanvas.getBackground().getRed(), fxCanvas.getBackground().getGreen(), fxCanvas.getBackground().getBlue()));
+			scene = new Scene(group, Color.rgb(0, 0, 0));
+			
+			fxCanvas.setScene(scene);
+			
+			view.setPreserveRatio(true);
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+			return false;
+		}
+		
+		vlcPlayer.setOnReady(new Runnable() {
+			
+			@Override
+			public void run() {
+				
+				timeRange.setMinimum(0);
+				Duration d = vlcPlayer.getMedia().getDuration();
+				if (d.toSeconds() > 0) {
+					timeRange.setMaximum((int) d.toSeconds());
+				}
+				timeRange.setLowerValue(start);
+				timeRange.setMiddleValue(start);
+				
+				System.out.println("start=" + start + " end=" + end);
+				vlcPlayer.setVolume(volume);
+				System.out.println("SEEK " + start + " D=" + Duration.seconds(start));
+				
+				vlcPlayer.setStartTime(Duration.seconds(start));
+				vlcPlayer.seek(Duration.seconds(start));
+				if (end > start) {
+					timeRange.setUpperValue(end);
+					vlcPlayer.setStopTime(Duration.seconds(end));
+				}
+				else if (d.toSeconds() > 0) {
+					System.out.println("end=length=" + d.toSeconds());
+					timeRange.setUpperValue((int) vlcPlayer.getMedia().getDuration().toSeconds());
+				}
+				Log.info("Playing media...");
+				
+				vlcPlayer.play();
+				resizeView();
+				
+				// if (new File(mrl + ".srt").exists()) { //$NON-NLS-1$
+				// vlcPlayer.sub.subpictures().setSubTitleFile(mrl + ".srt"); //$NON-NLS-1$
+				// }
+				currentlyPlayed = JFXPlayer.this.mrl;
+				previouslyPlayed = JFXPlayer.this.mrl;
+				
+				if (!playButton.isDisposed()) {
+					playButton.setText(MessagesMP.pause);
+				}
+				firstLengthEvent = true;
+				// }
+				// });
+			}
+		});
+		
+		
+		
+		return true;
+	}
+	
+	private void initializePlayerListeners() {
+		
+		vlcPlayer.currentTimeProperty().addListener(new InvalidationListener() {
+			
+			@Override
+			public void invalidated(Observable ov) {
+				if (videoComposite.isDisposed()) return;
+				if (vlcPlayer == null) return;
+				
+				Duration currentTime = vlcPlayer.getCurrentTime();
+				time = (int) currentTime.toSeconds();
+				if (previous == time) {
+					return;
+				}
+				previous = time;
+				
+				timeLabel.getDisplay().syncExec(new Runnable() {
+					
+					@Override
+					public void run() {
+						if (timeRange.isDisposed()) {
+							return;
+						}
+						if (!timeRange.isDragMiddleKnob()) {
+							timeRange.setMiddleValue((int) time);
+						}
+						updateTimeLabel();
+						
+						// if (time >= end && end != start) {
+						// if (repeat) {
+						// vlcPlayer.seek(Duration.seconds(start));
+						// }
+						// else {
+						// vlcPlayer.stop();
+						// }
+						// }
+					}
+				});
+			}
+		});
+	}
+	
+	@Override
+	public void setRepeat(boolean repeat) {
+		this.repeat = repeat;
+		if (this.repeat) {
+			vlcPlayer.setCycleCount(Integer.MAX_VALUE);
+		}
+		else {
+			vlcPlayer.setCycleCount(0);
+		}
+		if (!repeatButton.isDisposed()) {
+			repeatButton.setSelection(repeat);
+		}
+	}
+	
+	@Override
+	public void stop() {
+		if (vlcPlayer == null) return; // nothing to do
+		userStopped = true;
+		vlcPlayer.stop();
+		
+		vlcPlayer.dispose();
+		vlcPlayer = null;
+		fxCanvas.setScene(null);
+		
+		currentlyPlayed = NOMEDIA;
+		if (!playButton.isDisposed()) {
+			playButton.setText(MessagesMP.play);
+		}
+	}
+	
+	@Override
+	public boolean isMediaLoaded() {
+		return vlcPlayer != null && vlcPlayer.getStatus().equals(Status.READY);
+	}
+}

Property changes on: tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/editors/vlcplayer/JFXPlayer.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/editors/vlcplayer/IPlayer.java
===================================================================
--- tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/editors/vlcplayer/IPlayer.java	(revision 0)
+++ tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/editors/vlcplayer/IPlayer.java	(revision 2445)
@@ -0,0 +1,21 @@
+package org.txm.backtomedia.editors.vlcplayer;
+
+
+public interface IPlayer {
+	
+	public void setCredentials(String login, String mdp);
+	
+	public boolean play(String mrl, String start, String end);
+	
+	public boolean play(String mrl, int start, int end);
+	
+	public boolean play(String mrl, int start);
+	
+	public void stop();
+	
+	public boolean isMediaLoaded();
+	
+	public void setRepeat(boolean b);
+	
+	public boolean isDisposed();
+}

Property changes on: tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/editors/vlcplayer/IPlayer.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/editors/vlcplayer/VLCPlayerEditor.java
===================================================================
--- tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/editors/vlcplayer/VLCPlayerEditor.java	(revision 2444)
+++ tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/editors/vlcplayer/VLCPlayerEditor.java	(revision 2445)
@@ -7,17 +7,27 @@
 import org.eclipse.ui.IEditorSite;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.part.EditorPart;
+import org.txm.backtomedia.commands.function.MediaPreferences;
+import org.txm.backtomedia.preferences.BackToMediaPreferences;
 
 public class VLCPlayerEditor extends EditorPart {
 	
 	/** The Constant ID. */
 	public static final String ID = VLCPlayerEditor.class.getCanonicalName(); // $NON-NLS-1$
 	
-	VLCPlayer player;
+	IPlayer player;
 	
 	@Override
 	public void createPartControl(Composite parent) {
-		player = new VLCPlayer(parent, SWT.NONE);
+		if ("JFX".equals(BackToMediaPreferences.getInstance().getString(BackToMediaPreferences.PLAYER))) {
+			player = new JFXPlayer(parent, SWT.NONE);
+		}
+		else if ("VLC".equals(BackToMediaPreferences.getInstance().getString(BackToMediaPreferences.PLAYER))) {
+			player = new VLCPlayer(parent, SWT.NONE);
+		}
+		else {
+			player = new JFXPlayer(parent, SWT.NONE);
+		}
 	}
 	
 	public void init() {
@@ -76,10 +86,11 @@
 		return false;
 	}
 	
-	public VLCPlayer getPlayer() {
+	public IPlayer getPlayer() {
 		return player;
 	}
 	
+	@Override
 	public void setPartName(String partName) {
 		super.setPartName(partName);
 	}
@@ -95,6 +106,6 @@
 	 * @return false if the media could not be loaded (file not found, access error...)
 	 */
 	public boolean isMediaLoaded() {
-		return player.getEmbeddedMediaPlayer().status().isPlayable();
+		return player.isMediaLoaded();
 	}
 }
Index: tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/commands/function/BackToMedia.java
===================================================================
--- tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/commands/function/BackToMedia.java	(revision 2444)
+++ tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/commands/function/BackToMedia.java	(revision 2445)
@@ -399,7 +399,6 @@
 		String media_directory = commandPreferences.get(BackToMediaPreferences.MEDIA_PATH_PREFIX, alternative);
 		boolean media_auth = "true".equals(commandPreferences.get(BackToMediaPreferences.MEDIA_AUTH, alternative));
 		String secured_media_login = commandPreferences.get(BackToMediaPreferences.MEDIA_AUTH_LOGIN, alternative);
-		String secured_media_password = System.getProperty(BackToMediaPreferences.MEDIA_AUTH_PASSWORD);
 		String media_format = commandPreferences.get(BackToMediaPreferences.MEDIA_EXTENSION, alternative);
 		String media_index = commandPreferences.get(BackToMediaPreferences.MEDIA_INDEX_NODE, alternative);
 		
@@ -434,7 +433,7 @@
 				String path_prefix = media_directory;
 				if (media_auth) {
 					
-					if (secured_media_password == null) {
+					if (System.getProperty(BackToMediaPreferences.MEDIA_AUTH_PASSWORD) == null) {
 						URL url = new URL(media_directory);
 						
 						UsernamePasswordDialog dialog = new UsernamePasswordDialog(shell, new boolean[] { true, true }, url.getHost());
@@ -442,14 +441,15 @@
 						dialog.setTitle("You must authenticate to access the media file");
 						dialog.setDetails(NLS.bind(TXMUIMessages.loginToP0, new URL(media_directory).getHost()));
 						if (dialog.open() == dialog.OK) {
+							System.setProperty(BackToMediaPreferences.MEDIA_AUTH_LOGIN, dialog.getUser());
 							System.setProperty(BackToMediaPreferences.MEDIA_AUTH_PASSWORD, dialog.getPassword());
-							secured_media_password = dialog.getPassword();
 						}
 						else {
+							System.setProperty(BackToMediaPreferences.MEDIA_AUTH_LOGIN, null);
+							System.setProperty(BackToMediaPreferences.MEDIA_AUTH_PASSWORD, null);
 							return null;
 						}
 					}
-					path_prefix = NLS.bind(media_directory, secured_media_login, secured_media_password);
 				}
 				
 				File audioFile = new File(path_prefix, textid + "." + media_format); //$NON-NLS-1$
@@ -505,7 +505,7 @@
 				vlcEditor = associatedEditors.get(editor);
 			}
 			
-			if (vlcEditor == null) {
+			if (vlcEditor == null || vlcEditor.getPlayer().isDisposed()) {
 				// System.out.println("new editor linked to "+ce);
 				vlcEditor = OpenVLCPlayer.openEditor();
 				
@@ -521,28 +521,32 @@
 					SWTEditorsUtils.addEditor((EditorPart) editor, vlcEditor, position);
 				}
 				
-				VLCPlayer player = vlcEditor.getPlayer();
+				Object player = vlcEditor.getPlayer();
 				if (player != null) {
-					player.hideStopButton();
+					// player.hideStopButton();
 					associatedEditors.put(editor, vlcEditor);
 				}
 			}
 			
+			if (media_auth) {
+				// path_prefix = NLS.bind(media_directory, secured_media_login, secured_media_password);
+				vlcEditor.getPlayer().setCredentials(System.getProperty(BackToMediaPreferences.MEDIA_AUTH_LOGIN), System.getProperty(BackToMediaPreferences.MEDIA_AUTH_PASSWORD));
+			}
 			vlcEditor.getPlayer().play(path, sStartTime, sEndTime);
 			vlcEditor.getPlayer().setRepeat(true);
 			
-			if (!vlcEditor.isMediaLoaded()) {
-				
-				vlcEditor.getSite().getPage().closeEditor(vlcEditor, false);
-				if (media_auth) {
-					Log.warning("The MediaPlayer could not open the media: " + media_directory); // don't show credentials
-					System.clearProperty(BackToMediaPreferences.MEDIA_AUTH_PASSWORD);
-					System.clearProperty(BackToMediaPreferences.MEDIA_AUTH_LOGIN);
-				}
-				else {
-					Log.warning("The MediaPlayer could not open the media: " + path);
-				}
-			}
+			// if (!vlcEditor.isMediaLoaded()) {
+			//
+			// vlcEditor.getSite().getPage().closeEditor(vlcEditor, false);
+			// if (media_auth) {
+			// Log.warning("The MediaPlayer could not open the media: " + media_directory); // don't show credentials
+			// System.clearProperty(BackToMediaPreferences.MEDIA_AUTH_PASSWORD);
+			// System.clearProperty(BackToMediaPreferences.MEDIA_AUTH_LOGIN);
+			// }
+			// else {
+			// Log.warning("The MediaPlayer could not open the media: " + path);
+			// }
+			// }
 			
 			if (path != null) {
 				vlcEditor.setPartName(textid);
Index: tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/commands/function/OpenVLCPlayer.java
===================================================================
--- tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/commands/function/OpenVLCPlayer.java	(revision 2444)
+++ tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/commands/function/OpenVLCPlayer.java	(revision 2445)
@@ -28,6 +28,8 @@
 package org.txm.backtomedia.commands.function;
 
 import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
@@ -89,8 +91,17 @@
 		// fd.setFilterExtensions(filterExt);
 		if (fd.open() == fd.OK) {
 			String mrl = fd.getValue();
-			if (mrl != null)
+			
+			if (mrl != null) {
+				File f = new File(mrl);
+				if (f.exists()) {
+					mrl = new File(mrl).toURI().toString();
+				}
+				else {
+					
+				}
 				openEditor(mrl, 0);
+			}
 		}
 		
 		return null;
Index: tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/commands/function/SimpleFileDialog.java
===================================================================
--- tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/commands/function/SimpleFileDialog.java	(revision 2444)
+++ tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/commands/function/SimpleFileDialog.java	(revision 2445)
@@ -5,6 +5,8 @@
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
@@ -21,9 +23,15 @@
 	
 	@Override
 	protected Control createDialogArea(Composite parent) {
-		Control p = super.createDialogArea(parent);
+		Composite p = (Composite) super.createDialogArea(parent);
 		
-		selectButton = new Button(parent, SWT.PUSH);
+		GridLayout layout = (GridLayout) p.getLayout();
+		layout.numColumns = layout.numColumns + 1;
+		
+		getText().setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, false, 2, 1));
+		setErrorMessage(null);
+		selectButton = new Button(p, SWT.PUSH);
+		selectButton.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, true));
 		selectButton.setText("...");
 		selectButton.addSelectionListener(new SelectionListener() {
 			
Index: tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/preferences/BackToMediaPreferencePage.java
===================================================================
--- tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/preferences/BackToMediaPreferencePage.java	(revision 2444)
+++ tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/preferences/BackToMediaPreferencePage.java	(revision 2445)
@@ -83,6 +83,8 @@
 	
 	private Group spanGroup;
 	
+	private ComboFieldEditor playerProperty;
+	
 	/**
 	 * Instantiates a new diagnostic preference page.
 	 */
@@ -153,6 +155,10 @@
 		addField(defaultStructureEndProperty);
 		
 		updateEnables(BackToMediaPreferences.getInstance().getString(BackToMediaPreferences.SYNCMODE));
+		
+		String[][] players = { { "JFX", "JFX" }, { "VLC", "VLC" } };
+		playerProperty = new ComboFieldEditor(BackToMediaPreferences.PLAYER, "Embedded player", players, getFieldEditorParent());
+		addField(playerProperty);
 	}
 	
 	public void updateEnables(String sync_mode) {
Index: tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/preferences/BackToMediaPreferences.java
===================================================================
--- tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/preferences/BackToMediaPreferences.java	(revision 2444)
+++ tmp/org.txm.backtomedia.rcp/src/org/txm/backtomedia/preferences/BackToMediaPreferences.java	(revision 2445)
@@ -31,7 +31,9 @@
 	
 	// the sync modes
 	public static final String WORDMODE = "Word";
+	
 	public static final String STRUCTUREMODE = "Structure";
+	
 	public static final String MILESTONEMODE = "Milestone";
 	
 	public static final String MEDIA_PATH_PREFIX = "media_path_prefix";
@@ -54,6 +56,8 @@
 	 */
 	public static final String BACKTOMEDIA_POSITION = "backtomedia_position"; //$NON-NLS-1$
 	
+	public static final String PLAYER = "player";
+	
 	public BackToMediaPreferences() {
 		// TODO Auto-generated constructor stub
 	}
@@ -63,6 +67,7 @@
 		super.initializeDefaultPreferences();
 		
 		Preferences preferences = DefaultScope.INSTANCE.getNode(getPreferencesNodeQualifier());
+		preferences.put(PLAYER, "JFX");
 		preferences.putBoolean(REPEAT, true);
 		preferences.put(SYNCMODE, MILESTONEMODE);
 		preferences.put(STRUCTURE, "u");
Index: tmp/org.txm.backtomedia.rcp/META-INF/MANIFEST.MF
===================================================================
--- tmp/org.txm.backtomedia.rcp/META-INF/MANIFEST.MF	(revision 2444)
+++ tmp/org.txm.backtomedia.rcp/META-INF/MANIFEST.MF	(revision 2445)
@@ -26,4 +26,119 @@
  uk.co.caprica.vlcj.factory.swt,
  uk.co.caprica.vlcj.player.embedded.videosurface.swt,
  vlcplayerrcp
+Import-Package: com.sun.javafx,
+ com.sun.javafx.animation,
+ com.sun.javafx.applet,
+ com.sun.javafx.application,
+ com.sun.javafx.beans,
+ com.sun.javafx.beans.event,
+ com.sun.javafx.binding,
+ com.sun.javafx.charts,
+ com.sun.javafx.collections,
+ com.sun.javafx.css,
+ com.sun.javafx.css.converters,
+ com.sun.javafx.css.parser,
+ com.sun.javafx.cursor,
+ com.sun.javafx.effect,
+ com.sun.javafx.embed,
+ com.sun.javafx.embed.swing,
+ com.sun.javafx.event,
+ com.sun.javafx.font,
+ com.sun.javafx.font.coretext,
+ com.sun.javafx.font.directwrite,
+ com.sun.javafx.font.freetype,
+ com.sun.javafx.font.t2k,
+ com.sun.javafx.fxml,
+ com.sun.javafx.fxml.builder,
+ com.sun.javafx.fxml.expression,
+ com.sun.javafx.geom,
+ com.sun.javafx.geom.transform,
+ com.sun.javafx.geometry,
+ com.sun.javafx.iio,
+ com.sun.javafx.iio.bmp,
+ com.sun.javafx.iio.common,
+ com.sun.javafx.iio.gif,
+ com.sun.javafx.iio.ios,
+ com.sun.javafx.iio.jpeg,
+ com.sun.javafx.iio.png,
+ com.sun.javafx.image,
+ com.sun.javafx.image.impl,
+ com.sun.javafx.jmx,
+ com.sun.javafx.logging,
+ com.sun.javafx.media,
+ com.sun.javafx.menu,
+ com.sun.javafx.perf,
+ com.sun.javafx.print,
+ com.sun.javafx.property,
+ com.sun.javafx.property.adapter,
+ com.sun.javafx.robot,
+ com.sun.javafx.robot.impl,
+ com.sun.javafx.runtime,
+ com.sun.javafx.runtime.async,
+ com.sun.javafx.runtime.eula,
+ com.sun.javafx.scene,
+ com.sun.javafx.scene.control,
+ com.sun.javafx.scene.control.behavior,
+ com.sun.javafx.scene.control.skin,
+ com.sun.javafx.scene.control.skin.caspian,
+ com.sun.javafx.scene.control.skin.caspian.images,
+ com.sun.javafx.scene.control.skin.modena,
+ com.sun.javafx.scene.control.skin.resources,
+ com.sun.javafx.scene.input,
+ com.sun.javafx.scene.layout.region,
+ com.sun.javafx.scene.paint,
+ com.sun.javafx.scene.shape,
+ com.sun.javafx.scene.text,
+ com.sun.javafx.scene.transform,
+ com.sun.javafx.scene.traversal,
+ com.sun.javafx.scene.web,
+ com.sun.javafx.scene.web.behavior,
+ com.sun.javafx.scene.web.skin,
+ com.sun.javafx.sg.prism,
+ com.sun.javafx.sg.prism.web,
+ com.sun.javafx.stage,
+ com.sun.javafx.text,
+ com.sun.javafx.tk,
+ com.sun.javafx.tk.quantum,
+ com.sun.javafx.util,
+ com.sun.javafx.webkit,
+ com.sun.javafx.webkit.prism,
+ com.sun.javafx.webkit.prism.resources,
+ com.sun.javafx.webkit.prism.theme,
+ com.sun.javafx.webkit.theme,
+ javafx.animation,
+ javafx.application,
+ javafx.beans,
+ javafx.beans.binding,
+ javafx.beans.property,
+ javafx.beans.property.adapter,
+ javafx.beans.value,
+ javafx.collections,
+ javafx.collections.transformation,
+ javafx.concurrent,
+ javafx.css,
+ javafx.embed.swing,
+ javafx.embed.swt,
+ javafx.event,
+ javafx.fxml,
+ javafx.geometry,
+ javafx.print,
+ javafx.scene,
+ javafx.scene.canvas,
+ javafx.scene.chart,
+ javafx.scene.control,
+ javafx.scene.control.cell,
+ javafx.scene.effect,
+ javafx.scene.image,
+ javafx.scene.input,
+ javafx.scene.layout,
+ javafx.scene.media,
+ javafx.scene.paint,
+ javafx.scene.shape,
+ javafx.scene.text,
+ javafx.scene.transform,
+ javafx.scene.web,
+ javafx.stage,
+ javafx.util,
+ javafx.util.converter
 
