diff --git a/src/main/java/org/olat/modules/video/VideoManager.java b/src/main/java/org/olat/modules/video/VideoManager.java
index 70b8124218b89b76c0c2f51b83603291fb6e9f11..1f50f82fe7b20154a956cacd370471d1eef7790b 100644
--- a/src/main/java/org/olat/modules/video/VideoManager.java
+++ b/src/main/java/org/olat/modules/video/VideoManager.java
@@ -45,6 +45,9 @@ import org.olat.resource.OLATResource;
  */
 public interface VideoManager {
 	
+	public static final String FILETYPE_SRT = "srt";
+	public static final String DOT = "." ;
+	
 	/**
 	 * Checks for video file.
 	 *
diff --git a/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java b/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
index 28d716d331bdb941e33f368a739c93495e1941d2..92f4850e4fc1f30020febcc328582cab5397af81 100644
--- a/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
+++ b/src/main/java/org/olat/modules/video/manager/VideoManagerImpl.java
@@ -105,14 +105,13 @@ public class VideoManagerImpl implements VideoManager {
 	protected static final String DIRNAME_REPOENTRY = "repoentry";
 	public static final String FILETYPE_MP4 = "mp4";
 	private static final String FILETYPE_JPG = "jpg";
-	private static final String FILETYPE_SRT = "srt";
 	private static final String FILENAME_POSTER_JPG = "poster.jpg";
 	private static final String FILENAME_VIDEO_MP4 = "video.mp4";
 	private static final String FILENAME_CHAPTERS_VTT = "chapters.vtt";
 	private static final String FILENAME_VIDEO_METADATA_XML = "video_metadata.xml";
 	private static final String DIRNAME_MASTER = "master";
 	public static final String TRACK = "track_";
-	public static final String DOT = "." ;
+
 	
 	private static final SimpleDateFormat displayDateFormat = new SimpleDateFormat("HH:mm:ss");
 	private static final SimpleDateFormat vttDateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
diff --git a/src/main/java/org/olat/modules/video/manager/VideoTranscodingDAO.java b/src/main/java/org/olat/modules/video/manager/VideoTranscodingDAO.java
index 8c84631017674b746785bf93bd559e69461b955c..cc8ce11585f4d36c07998c22cbbffff121aaa2bd 100644
--- a/src/main/java/org/olat/modules/video/manager/VideoTranscodingDAO.java
+++ b/src/main/java/org/olat/modules/video/manager/VideoTranscodingDAO.java
@@ -26,7 +26,6 @@ import java.util.List;
 import javax.persistence.EntityNotFoundException;
 
 import org.olat.core.commons.persistence.DB;
-import org.olat.modules.video.VideoManager;
 import org.olat.modules.video.VideoTranscoding;
 import org.olat.modules.video.model.TranscodingCount;
 import org.olat.modules.video.model.VideoTranscodingImpl;
@@ -47,8 +46,6 @@ public class VideoTranscodingDAO {
 
 	@Autowired
 	private DB dbInstance;
-	@Autowired 
-	private VideoManager videoManager;
 
 	/**
 	 * Factory method to create and persist new video transcoding objects for a
diff --git a/src/main/java/org/olat/modules/video/ui/QualityTableRow.java b/src/main/java/org/olat/modules/video/ui/QualityTableRow.java
index c6f0cdb11065143b6a897cc0d864c9fa17474517..b3f7b750c08ee98e49dca7b78c0e1cc47d0348ca 100644
--- a/src/main/java/org/olat/modules/video/ui/QualityTableRow.java
+++ b/src/main/java/org/olat/modules/video/ui/QualityTableRow.java
@@ -19,7 +19,6 @@
  */
 package org.olat.modules.video.ui;
 
-import org.olat.core.gui.components.form.flexible.FormUIFactory;
 import org.olat.core.gui.components.form.flexible.elements.FormLink;
 
 /**
@@ -37,8 +36,6 @@ public class QualityTableRow {
 	private String format;
 	private FormLink deleteLink;
 
-	protected FormUIFactory uifactory = FormUIFactory.getInstance();
-
 	/**
 	 * 
 	 * @param resolution
diff --git a/src/main/java/org/olat/modules/video/ui/TrackTableRow.java b/src/main/java/org/olat/modules/video/ui/TrackTableRow.java
index a61129732e9fd2bcd4e9572cb889a5876b2b36b7..025d1db6127ab8ea0f9baf85e5e78db28a4caba3 100644
--- a/src/main/java/org/olat/modules/video/ui/TrackTableRow.java
+++ b/src/main/java/org/olat/modules/video/ui/TrackTableRow.java
@@ -19,7 +19,6 @@
  */
 package org.olat.modules.video.ui;
 
-import org.olat.core.gui.components.form.flexible.FormUIFactory;
 import org.olat.core.gui.components.form.flexible.elements.FormLink;
 import org.olat.core.util.vfs.VFSLeaf;
 
@@ -32,30 +31,25 @@ import org.olat.core.util.vfs.VFSLeaf;
  */
 public class TrackTableRow {
 
-	private String language;
-	private VFSLeaf track;
-	private FormLink deleteLink;
-
-	protected FormUIFactory uifactory = FormUIFactory.getInstance();
+	private final String language;
+	private final VFSLeaf track;
+	private final FormLink deleteLink;
 
 	public TrackTableRow(String language, VFSLeaf track, FormLink deleteLink) {
 		this.language = language;
 		this.track = track;
 		this.deleteLink = deleteLink;
-		this.deleteLink.setIconLeftCSS("o_icon o_icon-fw o_icon_delete_item");
-
 	}
 
-	public VFSLeaf getTrack(){
+	public VFSLeaf getTrack() {
 		return track;
 	}
 
-	public String getLanguage(){
+	public String getLanguage() {
 		return language;
 	}
 
-	public FormLink getDeleteLink(){
+	public FormLink getDeleteLink() {
 		return deleteLink;
 	}
-
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/video/ui/TrackUploadEvent.java b/src/main/java/org/olat/modules/video/ui/TrackUploadEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..5341ffb763a2b195d7a5baec138a9159176a02a5
--- /dev/null
+++ b/src/main/java/org/olat/modules/video/ui/TrackUploadEvent.java
@@ -0,0 +1,50 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.modules.video.ui;
+
+import org.olat.core.gui.control.Event;
+import org.olat.core.util.vfs.VFSLeaf;
+
+/**
+ * 
+ * Initial date: 21 sept. 2017<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class TrackUploadEvent extends Event {
+
+	private static final long serialVersionUID = -2951558903014424854L;
+	private final String lang;
+	private final VFSLeaf track;
+	
+	public TrackUploadEvent(String lang, VFSLeaf track) {
+		super("track-upload");
+		this.lang = lang;
+		this.track = track;
+	}
+
+	public String getLang() {
+		return lang;
+	}
+
+	public VFSLeaf getTrack() {
+		return track;
+	}
+}
diff --git a/src/main/java/org/olat/modules/video/ui/TranscodingQueueTableModel.java b/src/main/java/org/olat/modules/video/ui/TranscodingQueueTableModel.java
index d2f8cabbdf0b4ad2cdb0f38ad6bce35a2159c0ce..ff347673fb8e120be7d229ec39533e36e46ea5aa 100644
--- a/src/main/java/org/olat/modules/video/ui/TranscodingQueueTableModel.java
+++ b/src/main/java/org/olat/modules/video/ui/TranscodingQueueTableModel.java
@@ -19,7 +19,6 @@
  */
 package org.olat.modules.video.ui;
 
-import org.olat.core.gui.components.form.flexible.FormUIFactory;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSortableColumnDef;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
@@ -34,7 +33,6 @@ import org.olat.core.gui.translator.Translator;
  */
 public class TranscodingQueueTableModel extends DefaultFlexiTableDataModel<TranscodingQueueTableRow>{
 
-	protected FormUIFactory uifactory = FormUIFactory.getInstance();
 	private Translator translator;
 	public TranscodingQueueTableModel(FlexiTableColumnModel columnModel, Translator translator) {
 		super(columnModel);
diff --git a/src/main/java/org/olat/modules/video/ui/TranscodingQueueTableRow.java b/src/main/java/org/olat/modules/video/ui/TranscodingQueueTableRow.java
index 218bc12be9f4024a8c0bbea43e42cc3f53abfd60..84ca97b8e577e6bee3d7b2c10f80c51bd0d8dae7 100644
--- a/src/main/java/org/olat/modules/video/ui/TranscodingQueueTableRow.java
+++ b/src/main/java/org/olat/modules/video/ui/TranscodingQueueTableRow.java
@@ -21,7 +21,6 @@ package org.olat.modules.video.ui;
 
 import java.util.Date;
 
-import org.olat.core.gui.components.form.flexible.FormUIFactory;
 import org.olat.core.gui.components.form.flexible.elements.FormLink;
 
 /**
@@ -42,8 +41,6 @@ public class TranscodingQueueTableRow {
 	private FormLink retranscodeLink;
 	private Object[] failureReason;
 
-	protected FormUIFactory uifactory = FormUIFactory.getInstance();
-
 
 	/**
 	 * Instantiates a new transcoding queue table row.
diff --git a/src/main/java/org/olat/modules/video/ui/TranscodingTableModel.java b/src/main/java/org/olat/modules/video/ui/TranscodingTableModel.java
index d5534291b93abb40aa14f2138db4af953892159d..81f34f0318e63d1641111556fa69b4c775cd51e5 100644
--- a/src/main/java/org/olat/modules/video/ui/TranscodingTableModel.java
+++ b/src/main/java/org/olat/modules/video/ui/TranscodingTableModel.java
@@ -19,7 +19,6 @@
  */
 package org.olat.modules.video.ui;
 
-import org.olat.core.gui.components.form.flexible.FormUIFactory;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSortableColumnDef;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
@@ -33,7 +32,6 @@ import org.olat.core.gui.translator.Translator;
  */
 public class TranscodingTableModel extends DefaultFlexiTableDataModel<TranscodingRow>{
 
-	protected FormUIFactory uifactory = FormUIFactory.getInstance();
 	private Translator translator;
 	public TranscodingTableModel(FlexiTableColumnModel columnModel, Translator translator) {
 		super(columnModel);
diff --git a/src/main/java/org/olat/modules/video/ui/VideoQualityTableModel.java b/src/main/java/org/olat/modules/video/ui/VideoQualityTableModel.java
index 9c98528d74fa066b85db16b0f797944987091491..639449e9d79f334e12701c26c39d4540fb0b637c 100644
--- a/src/main/java/org/olat/modules/video/ui/VideoQualityTableModel.java
+++ b/src/main/java/org/olat/modules/video/ui/VideoQualityTableModel.java
@@ -19,7 +19,6 @@
  */
 package org.olat.modules.video.ui;
 
-import org.olat.core.gui.components.form.flexible.FormUIFactory;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSortableColumnDef;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
@@ -34,7 +33,6 @@ import org.olat.core.gui.translator.Translator;
  */
 public class VideoQualityTableModel extends DefaultFlexiTableDataModel<QualityTableRow>{
 
-	protected FormUIFactory uifactory = FormUIFactory.getInstance();
 	private Translator translator;
 	public VideoQualityTableModel(FlexiTableColumnModel columnModel, Translator translator) {
 		super(columnModel);
diff --git a/src/main/java/org/olat/modules/video/ui/VideoTrackEditController.java b/src/main/java/org/olat/modules/video/ui/VideoTrackEditController.java
index 426c69285927e800a203c63f190d106d4b369c19..80035a0dac27ab515cc2ce538c7c80fb6fbed37d 100644
--- a/src/main/java/org/olat/modules/video/ui/VideoTrackEditController.java
+++ b/src/main/java/org/olat/modules/video/ui/VideoTrackEditController.java
@@ -20,10 +20,9 @@
 package org.olat.modules.video.ui;
 
 import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
-import org.olat.core.commons.modules.bc.FolderEvent;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
@@ -58,11 +57,10 @@ public class VideoTrackEditController extends FormBasicController {
 	private VideoTrackUploadForm trackUploadForm;
 	private CloseableModalController cmc;
 
-	private Map<String, TrackTableRow> rows;
-
+	private OLATResource videoResource;
+	
 	@Autowired
 	private VideoManager videoManager;
-	private OLATResource videoResource;
 
 	public VideoTrackEditController(UserRequest ureq, WindowControl wControl, OLATResource videoResource) {
 		super(ureq, wControl, LAYOUT_BAREBONE);
@@ -87,78 +85,82 @@ public class VideoTrackEditController extends FormBasicController {
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, TrackTableCols.file.i18nKey(), TrackTableCols.file.ordinal(), true, TrackTableCols.file.name()));
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(TrackTableCols.language.i18nKey(), TrackTableCols.language.ordinal(), true, TrackTableCols.language.name()));
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(true, TrackTableCols.delete.i18nKey(), TrackTableCols.delete.ordinal(),false, TrackTableCols.delete.name()));
-		tableModel = new VideoTracksTableModel(columnsModel, getTranslator());
+		tableModel = new VideoTracksTableModel(columnsModel, getLocale());
 
 		tableEl = uifactory.addTableElement(getWindowControl(), "tracks", tableModel, getTranslator(), generalCont);
 		tableEl.setCustomizeColumns(false);
 		Map<String, VFSLeaf> tracks = videoManager.getAllTracks(videoResource);
-		rows = new HashMap<String,TrackTableRow>(tracks.size());
-		if (!tracks.isEmpty()) {
-			for (Map.Entry<String, VFSLeaf> entry : tracks.entrySet()) {
-				FormLink delButton = uifactory.addFormLink(entry.getKey(), "deleteTrack", "track.delete", "track.delete", null, Link.BUTTON);
-				rows.put(entry.getKey(), new TrackTableRow(entry.getKey(), entry.getValue(), delButton));
-
-			}
-			tableModel.setObjects(new ArrayList<TrackTableRow>(rows.values()));
+		List<TrackTableRow> rows = new ArrayList<>(tracks.size());
+		for (Map.Entry<String, VFSLeaf> entry : tracks.entrySet()) {
+			rows.add(forgeRow(entry.getKey(), entry.getValue()));
 		}
-//		tableEl.setVisible(!videoManager.getAllTracks(videoResource).isEmpty());
-		tableEl.setVisible(true);
+		tableModel.setObjects(rows);
 		tableEl.setEmtpyTableMessageKey("track.notrack");
 
 		addButton = uifactory.addFormLink("add.track", generalCont, Link.BUTTON);
 	}
-
-	@Override
-	protected boolean validateFormLogic(UserRequest ureq) {
-
-		return true;
+	
+	private TrackTableRow forgeRow(String language, VFSLeaf track) {
+		FormLink delButton = uifactory.addFormLink("lang_".concat(language), "deleteTrack", "track.delete", "track.delete", null, Link.LINK);
+		delButton.setIconLeftCSS("o_icon o_icon-fw o_icon_delete_item");
+		TrackTableRow row = new TrackTableRow(language, track, delButton);
+		delButton.setUserObject(row);
+		return row;
 	}
 
 	@Override
 	protected void formOK(UserRequest ureq) {
-
+		//
 	}
 
 	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if (addButton == source) {
 			doAddTrack(ureq);
-		}else if (source.getComponent() instanceof Link){
-			String lang = rows.get(source.getName()).getLanguage();
-			videoManager.removeTrack(videoResource, lang);
-			rows.remove(rows.get(source.getName()).getLanguage());
-			tableModel.setObjects(new ArrayList<TrackTableRow>(rows.values()));
-			tableEl.reset();
+		} else if (source instanceof FormLink) {
+			FormLink link = (FormLink)source;
+			if("deleteTrack".equals(link.getCmd())) {
+				TrackTableRow row = (TrackTableRow)link.getUserObject();
+				videoManager.removeTrack(videoResource, row.getLanguage());
+				List<TrackTableRow> rows = tableModel.getObjects();
+				rows.remove(row);
+				tableModel.setObjects(rows);
+				tableEl.reset(true, true, true);
+			}
 		}
 	}
 
 	@Override
 	public void event(UserRequest ureq, Controller source, Event event) {
-		if(source == trackUploadForm){
-			rows.put(trackUploadForm.getLang(), new TrackTableRow(trackUploadForm.getLang(), (VFSLeaf) ((FolderEvent) event).getItem(), uifactory.addFormLink(trackUploadForm.getLang(),"deleteTrack", "track.delete", "track.delete", null, Link.BUTTON)));
-			tableModel.setObjects(new ArrayList<TrackTableRow>(rows.values()));
-			tableEl.reset();
-			tableEl.setVisible(true);
-			tableEl.setEnabled(true);
-			cmc.deactivate();
-			// cleanup
-			removeAsListenerAndDispose(trackUploadForm);
-			removeAsListenerAndDispose(cmc);
-		} else if(event.getCommand() == "CLOSE_MODAL_EVENT"){
+		if(source == trackUploadForm) {
+			if(event instanceof TrackUploadEvent) {
+				TrackUploadEvent fEvent = (TrackUploadEvent)event;
+				TrackTableRow row = forgeRow(fEvent.getLang(), fEvent.getTrack());
+				List<TrackTableRow> rows = tableModel.getObjects();
+				rows.add(row);
+				tableModel.setObjects(rows);
+				tableEl.reset(true, true, true);
+			}
 			cmc.deactivate();
-			// cleanup
-			removeAsListenerAndDispose(trackUploadForm);
-			removeAsListenerAndDispose(cmc);
+			cleanUp();
+		} else if(cmc == source){
+			cleanUp();
 		}
 	}
-
+	
+	private void cleanUp() {
+		removeAsListenerAndDispose(trackUploadForm);
+		removeAsListenerAndDispose(cmc);
+		trackUploadForm = null;
+		cmc = null;
+	}
 
 	private void doAddTrack(UserRequest ureq) {
 		trackUploadForm = new VideoTrackUploadForm(ureq, getWindowControl(), videoResource);
 		listenTo(trackUploadForm);
+		
 		cmc = new CloseableModalController(getWindowControl(), "close", trackUploadForm.getInitialComponent());
 		listenTo(cmc);
 		cmc.activate();
 	}
-
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/video/ui/VideoTrackUploadForm.java b/src/main/java/org/olat/modules/video/ui/VideoTrackUploadForm.java
index 26cbc5529caed726208d54715aaad998d2a91b38..de9d549906d08a5b237f50993b73e525385040ca 100644
--- a/src/main/java/org/olat/modules/video/ui/VideoTrackUploadForm.java
+++ b/src/main/java/org/olat/modules/video/ui/VideoTrackUploadForm.java
@@ -21,14 +21,10 @@ package org.olat.modules.video.ui;
 
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
-import java.util.Set;
 import java.util.stream.Collectors;
 
-import org.apache.commons.io.FilenameUtils;
-import org.olat.core.commons.modules.bc.FolderEvent;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.FileElement;
@@ -36,9 +32,10 @@ import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 import org.olat.core.gui.control.Controller;
+import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
-import org.olat.core.util.vfs.Quota;
 import org.olat.core.util.vfs.VFSContainer;
+import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.modules.video.VideoManager;
 import org.olat.modules.video.manager.VideoManagerImpl;
 import org.olat.resource.OLATResource;
@@ -56,17 +53,11 @@ public class VideoTrackUploadForm extends FormBasicController {
 	
 	private FileElement fileEl;
 	private SingleSelection langsItem;
-	private long remainingSpace;
 	private VFSContainer mediaContainer;
 	
 	@Autowired
 	private VideoManager videoManager;
 
-	private static final Set<String> trackMimeTypes = new HashSet<String>();
-	static {
-		trackMimeTypes.add("text/plain");
-	}
-
 	public VideoTrackUploadForm(UserRequest ureq, WindowControl wControl, OLATResource videoResource) {
 		super(ureq, wControl);
 		mediaContainer = videoManager.getMasterContainer(videoResource);
@@ -75,13 +66,10 @@ public class VideoTrackUploadForm extends FormBasicController {
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		remainingSpace = Quota.UNLIMITED;
-		List<String> langs = new ArrayList<String>();
-		List<String> dispLangs = new ArrayList<String>();
-
-
+		List<String> langs = new ArrayList<>();
+		List<String> dispLangs = new ArrayList<>();
 		for(Locale locale : SimpleDateFormat.getAvailableLocales()){
-			if(locale.hashCode()!=0){
+			if(locale.hashCode() != 0){
 				langs.add(locale.getLanguage());
 				dispLangs.add(locale.getDisplayLanguage(getTranslator().getLocale()));
 			}
@@ -90,47 +78,57 @@ public class VideoTrackUploadForm extends FormBasicController {
 		List<String> langsWithoutDup = langs.parallelStream().distinct().collect(Collectors.toList());
 		List<String> dispLangsWithoutDup = dispLangs.parallelStream().distinct().collect(Collectors.toList());
 
-		langsItem = uifactory.addDropdownSingleselect("track.langs", formLayout, langsWithoutDup.toArray(new String[langsWithoutDup.size()]), dispLangsWithoutDup.toArray(new String[dispLangsWithoutDup.size()]), null);
+		langsItem = uifactory.addDropdownSingleselect("track.langs", formLayout,
+				langsWithoutDup.toArray(new String[langsWithoutDup.size()]),
+				dispLangsWithoutDup.toArray(new String[dispLangsWithoutDup.size()]), null);
 		fileEl = uifactory.addFileElement(getWindowControl(), "track.upload", formLayout);
-//		fileEl.limitToMimeType(trackMimeTypes, "video.config.track.error.type", null);
 		langsItem.setMandatory(true);
 
 		FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttonGroupLayout", getTranslator());
 		formLayout.add(buttonGroupLayout);
 		buttonGroupLayout.setElementCssClass("o_sel_upload_buttons");
+		
+		uifactory.addFormCancelButton("cancel", buttonGroupLayout, ureq, getWindowControl());
 		uifactory.addFormSubmitButton("track.upload", buttonGroupLayout);
 	}
 
 	@Override
-	protected void formOK(UserRequest ureq) {
-		if ( fileEl.isUploadSuccess()) {
-			if (remainingSpace != -1) {
-				if (fileEl.getUploadFile().length() / 1024 > remainingSpace) {
-					fileEl.setErrorKey("QuotaExceeded", null);
-					fileEl.getUploadFile().delete();
-					return;
-				}
-			} else {
-				String uploadfilename = VideoManagerImpl.TRACK + langsItem.getSelectedKey() + VideoManagerImpl.DOT
-						+ FilenameUtils.getExtension(fileEl.getUploadFileName());
-				fileEl.setUploadFileName(uploadfilename);
-				fireEvent(ureq, new FolderEvent(FolderEvent.UPLOAD_EVENT, fileEl.moveUploadFileTo(mediaContainer)));
+	protected boolean validateFormLogic(UserRequest ureq) {
+		boolean allOk = true;
+		
+		fileEl.clearError();
+		if (fileEl.isUploadSuccess()) {
+			String filename = fileEl.getUploadFileName();
+			if(!filename.endsWith(VideoManager.FILETYPE_SRT)) {
+				fileEl.setErrorKey("track.upload.error.filetype", null);
+				allOk &= false;
 			}
 		} else {
 			fileEl.setErrorKey("track.upload.error.nofile", null);
+			allOk &= false;
 		}
 
+		return allOk & super.validateFormLogic(ureq);
 	}
 
-
-	protected String getLang(){
-		return langsItem.getSelectedKey();
+	@Override
+	protected void formOK(UserRequest ureq) {
+		if (fileEl.isUploadSuccess()) {
+			String uploadfilename = VideoManagerImpl.TRACK + langsItem.getSelectedKey()
+				+ VideoManager.DOT + VideoManager.FILETYPE_SRT;
+			fileEl.setUploadFileName(uploadfilename);
+			VFSLeaf track = fileEl.moveUploadFileTo(mediaContainer);
+			fireEvent(ureq, new TrackUploadEvent(langsItem.getSelectedKey(), track));
+		}
 	}
 
+	@Override
+	protected void formCancelled(UserRequest ureq) {
+		fireEvent(ureq, Event.CANCELLED_EVENT);
+	}
 
 	@Override
 	protected void doDispose() {
 		// nothing to dispose
-
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/video/ui/VideoTracksTableModel.java b/src/main/java/org/olat/modules/video/ui/VideoTracksTableModel.java
index b11e79c29193d15636da9814eb442321711c18a1..2a33ec90ade4cb27d770b45eed55cd4d110363f6 100644
--- a/src/main/java/org/olat/modules/video/ui/VideoTracksTableModel.java
+++ b/src/main/java/org/olat/modules/video/ui/VideoTracksTableModel.java
@@ -21,10 +21,8 @@ package org.olat.modules.video.ui;
 
 import java.util.Locale;
 
-import org.olat.core.gui.components.form.flexible.FormUIFactory;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
-import org.olat.core.gui.translator.Translator;
 
 /**
  * table-model for to list de available subtitle-tracks in the metadata
@@ -35,16 +33,16 @@ import org.olat.core.gui.translator.Translator;
  */
 public class VideoTracksTableModel extends DefaultFlexiTableDataModel<TrackTableRow>{
 
-	protected FormUIFactory uifactory = FormUIFactory.getInstance();
-	private Translator translator;
-	public VideoTracksTableModel(FlexiTableColumnModel columnModel, Translator translator) {
+	private final Locale locale;
+	
+	public VideoTracksTableModel(FlexiTableColumnModel columnModel, Locale locale) {
 		super(columnModel);
-		this.translator = translator;
+		this.locale = locale;
 	}
 
 	@Override
 	public VideoTracksTableModel createCopyWithEmptyList() {
-		return new VideoTracksTableModel(getTableColumnModel(), translator);
+		return new VideoTracksTableModel(getTableColumnModel(), locale);
 	}
 
 
@@ -53,7 +51,7 @@ public class VideoTracksTableModel extends DefaultFlexiTableDataModel<TrackTable
 		TrackTableRow track = getObject(row);
 		switch(TrackTableCols.values()[col]) {
 			case file: return track.getTrack();
-			case language: return new Locale(track.getLanguage()).getDisplayLanguage(this.translator.getLocale());
+			case language: return new Locale(track.getLanguage()).getDisplayLanguage(locale);
 			case delete: return track.getDeleteLink();
 			default: return "";
 		}
@@ -74,5 +72,4 @@ public class VideoTracksTableModel extends DefaultFlexiTableDataModel<TrackTable
 			return i18nKey;
 		}
 	}
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_de.properties
index 3b6c48c2d246712c6c6fc503ccd8df8f09fd5cc3..ce4a5405de9ba2dc9a85d5eed496e10d8a1847e7 100644
--- a/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_de.properties
@@ -27,7 +27,7 @@ number.transcodings.failed=fehlgeschlagen
 poster.error.filetype=F\u00FCr Poster Bild werden nur Bilder vom Typ JPG unterst\u00FCtzt.
 poster.help=Bild vom Typ JPG. Bitte \u00FCberpr\u00FCfen Sie, ob das Poster genau die gleiche Aufl\u00F6sung hat wie das Originalvideo (gleiche H\u00F6he und Breite in Pixel).
 poster.select=W\u00E4hlen Sie ein Posterbild aus
-quality.delete=l\u00F6schen
+quality.delete=L\u00F6schen
 quality.master=Master video
 quality.resolution.1080=1080p Full-HD
 quality.resolution.2160=2160p 4K
@@ -70,13 +70,14 @@ topnav.video.alt=Bibliothek mit frei verf\u00FCgbaren Lernvideos
 track.delete=L\u00F6schen
 track.langs=Sprache
 track.notrack=F\u00FCr dieses Video wurden noch keine Untertitel hinterlegt. W\u00E4hlen Sie den Button "$\:add.track" um Untertiteldateien hinzuzuf\u00FCgen.
-track.table.header.delete=l\u00F6schen
+track.table.header.delete=L\u00F6schen
 track.table.header.file=Datei
 track.table.header.language=Sprache
 track.table.label=Untertitel
 track.upload=Hochladen
 track.upload.error.nofile=Bitte w\u00E4hlen Sie eine Datei aus.
 track.upload.error.nolang=Bitte w\u00E4hlen Sie eine Sprache aus dieser Liste aus
+track.upload.error.filetype=F\u00FCr Untertitel werden nur Datei vom Typ WebVTT mit dem Endung .srt unterst\u00FCtzt.
 transcoding.processing=In Bearbeitung
 transcoding.waiting=In Warteschlange
 transcoding.error=Stammdatei besch\u00E4digt
@@ -109,7 +110,7 @@ video.config.track.error.type=nur *.vtt and *.srt Dateien sind erlaubt
 video.config.track.table.file=Untertitel Datei
 video.config.tracks=Verf\u00FCgbare Untertiteldateien
 video.config.tracks.table.add=hinzuf\u00FCgen
-video.config.tracks.table.delete=l\u00F6schen
+video.config.tracks.table.delete=L\u00F6schen
 video.config.tracks.table.lang=Sprache
 video.config.width=Breite
 video.contact=Kontakt
diff --git a/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_en.properties
index c1ce0d95a2568b2ae1d10d5625f46133e7a34cea..9f28e08b33f7db9bba551cd0f916b9033ed9f90c 100644
--- a/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_en.properties
@@ -77,6 +77,7 @@ track.table.label=Subtitles
 track.upload=Upload
 track.upload.error.nofile=Please select a file.
 track.upload.error.nolang=Please select a language form the list
+track.upload.error.filetype=For subtitles only files of type WebVTT with the ending .srt are supported.
 transcoding.processing=Processing
 transcoding.waiting=Queuing
 transcoding.error=Master file damaged
diff --git a/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_fr.properties
index d4a06f98b6bd54aa77f3771f0aa5a28f7840086e..3e5abeb9b306c434a481fbcfaebb3e9555061873 100644
--- a/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/modules/video/ui/_i18n/LocalStrings_fr.properties
@@ -78,6 +78,7 @@ track.table.label=Sous-titres
 track.upload=T\u00E9l\u00E9charger
 track.upload.error.nofile=Choisissez un fichier s'il vous pla\u00EEt.
 track.upload.error.nolang=Choisissez une langue de la liste
+track.upload.error.filetype=Pour les sous-titres, seuls les fichiers au format WebVTT avec le suffixe .srt sont support\u00E9s.
 transcoding.error=Master endommag\u00E9
 transcoding.inefficient=Qualit\u00E9 m\u00E9diocre
 transcoding.processing=En cours