diff --git a/src/main/java/org/olat/course/nodes/gta/ui/DocumentUploadController.java b/src/main/java/org/olat/course/nodes/gta/ui/DocumentUploadController.java
index 4026e0e3ebbb1b3cf7c81213f0b5f385be3bca78..486677e64f0567e03923351238b18aa4a50a715b 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/DocumentUploadController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/DocumentUploadController.java
@@ -30,10 +30,11 @@ 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.FileUtils;
 import org.olat.course.nodes.gta.ui.SubmitDocumentsController.SubmittedSolution;
 
 /**
- * 
+ *
  * Initial date: 27.02.2015<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
@@ -43,11 +44,11 @@ public class DocumentUploadController extends FormBasicController {
 	private FileElement fileEl;
 	private final File fileToReplace;
 	private final SubmittedSolution solution;
-	
+
 	public DocumentUploadController(UserRequest ureq, WindowControl wControl) {
 		this(ureq, wControl, null, null);
 	}
-	
+
 	public DocumentUploadController(UserRequest ureq, WindowControl wControl, SubmittedSolution solution, File fileToReplace) {
 		super(ureq, wControl);
 		this.solution = solution;
@@ -62,29 +63,29 @@ public class DocumentUploadController extends FormBasicController {
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		formLayout.setElementCssClass("o_sel_course_gta_upload_form");
-		
+
 		fileEl = uifactory.addFileElement(getWindowControl(), "file", "solution.file", formLayout);
 		fileEl.setMandatory(true);
 		fileEl.addActionListener(FormEvent.ONCHANGE);
 		if(fileToReplace != null) {
 			fileEl.setInitialFile(fileToReplace);
 		}
-		
+
 		FormLayoutContainer buttonCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
 		buttonCont.setRootForm(mainForm);
 		formLayout.add(buttonCont);
 		uifactory.addFormSubmitButton("save", buttonCont);
 		uifactory.addFormCancelButton("cancel", buttonCont, ureq, getWindowControl());
 	}
-	
+
 	public String getUploadedFilename() {
 		return fileEl.getUploadFileName();
 	}
-	
+
 	public File getUploadedFile() {
 		return fileEl.getUploadFile();
 	}
-	
+
 	@Override
 	protected void doDispose() {
 		//
@@ -93,13 +94,16 @@ public class DocumentUploadController extends FormBasicController {
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) {
 		boolean allOk = true;
-		
+
 		fileEl.clearError();
 		if(fileEl.getUploadFile() == null) {
 			fileEl.setErrorKey("form.mandatory.hover", null);
 			allOk &= false;
+		} else if (!FileUtils.validateFilename(fileEl.getUploadFileName())) {
+			fileEl.setErrorKey("error.file.invalid", null);
+			allOk = false;
 		}
-		
+
 		return allOk & super.validateFormLogic(ureq);
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/EditSolutionController.java b/src/main/java/org/olat/course/nodes/gta/ui/EditSolutionController.java
index b4cd37a1ae6ff6c944d75c75b5e645dda8797211..e6929dc05c73028cb7149cb4a48564e19ddd1ed7 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/EditSolutionController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/EditSolutionController.java
@@ -36,6 +36,7 @@ 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.FileUtils;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
@@ -44,32 +45,32 @@ import org.olat.course.nodes.gta.model.Solution;
 
 
 /**
- * 
+ *
  * Initial date: 24.02.2015<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
 public class EditSolutionController extends FormBasicController {
-	
+
 	private TextElement titleEl;
 	private FileElement fileEl;
-	
+
 	private final boolean replaceFile;
 	private final Solution solution;
 	private final File solutionDir;
 	private final VFSContainer solutionContainer;
 	private final String filenameToReplace;
-	
+
 	public EditSolutionController(UserRequest ureq, WindowControl wControl,
 			File solutionDir, VFSContainer solutionContainer) {
 		this(ureq, wControl, new Solution(), solutionDir, solutionContainer, false);
 	}
-	
+
 	public EditSolutionController(UserRequest ureq, WindowControl wControl, Solution solution,
 			File solutionDir, VFSContainer solutionContainer) {
 		this(ureq, wControl, solution, solutionDir, solutionContainer, true);
 	}
-	
+
 	private EditSolutionController(UserRequest ureq, WindowControl wControl,
 			Solution solution, File solutionDir, VFSContainer solutionContainer, boolean replaceFile) {
 		super(ureq, wControl);
@@ -80,11 +81,11 @@ public class EditSolutionController extends FormBasicController {
 		this.solutionContainer = solutionContainer;
 		initForm(ureq);
 	}
-	
+
 	public Solution getSolution() {
 		return solution;
 	}
-	
+
 	public String getFilenameToReplace() {
 		return filenameToReplace;
 	}
@@ -92,7 +93,7 @@ public class EditSolutionController extends FormBasicController {
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		formLayout.setElementCssClass("o_sel_course_gta_upload_solution_form");
-		
+
 		String title = solution.getTitle() == null ? "" : solution.getTitle();
 		titleEl = uifactory.addTextElement("title", "solution.title", 128, title, formLayout);
 		titleEl.setElementCssClass("o_sel_course_gta_upload_solution_title");
@@ -107,7 +108,7 @@ public class EditSolutionController extends FormBasicController {
 				fileEl.setInitialFile(currentFile);
 			}
 		}
-		
+
 		FormLayoutContainer buttonCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
 		buttonCont.setRootForm(mainForm);
 		formLayout.add(buttonCont);
@@ -119,30 +120,33 @@ public class EditSolutionController extends FormBasicController {
 	protected void doDispose() {
 		//
 	}
-	
+
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) {
 		boolean allOk = true;
-		
+
 		titleEl.clearError();
 		if(!StringHelper.containsNonWhitespace(titleEl.getValue())) {
 			titleEl.setErrorKey("form.mandatory.hover", null);
 			allOk &= false;
 		}
-		
+
 		fileEl.clearError();
 		if(fileEl.getInitialFile() == null && fileEl.getUploadFile() == null) {
 			fileEl.setErrorKey("form.mandatory.hover", null);
 			allOk &= false;
+		} else if (!FileUtils.validateFilename(fileEl.getUploadFileName())) {
+			fileEl.setErrorKey("error.file.invalid", null);
+			allOk = false;
 		}
-		
+
 		return allOk & super.validateFormLogic(ureq);
 	}
 
 	@Override
 	protected void formOK(UserRequest ureq) {
 		solution.setTitle(titleEl.getValue());
-		
+
 		if(fileEl.getUploadFile() != null) {
 			if(replaceFile && StringHelper.containsNonWhitespace(solution.getFilename())) {
 				File currentFile = new File(solutionDir, solution.getFilename());
@@ -150,7 +154,7 @@ public class EditSolutionController extends FormBasicController {
 					currentFile.delete();
 				}
 			}
-			
+
 			String filename = fileEl.getUploadFileName();
 			if(!replaceFile) {
 				File currentFile = new File(solutionDir, filename);
@@ -158,14 +162,14 @@ public class EditSolutionController extends FormBasicController {
 					filename = VFSManager.rename(solutionContainer, filename);
 				}
 			}
-			
+
 			solution.setFilename(filename);
-			
+
 			try {
 				Path upload = fileEl.getUploadFile().toPath();
 				File newFile = new File(solutionDir, filename);
 				Files.move(upload, newFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
-				
+
 				VFSItem uploadedItem = solutionContainer.resolve(filename);
 				if(uploadedItem instanceof MetaTagged) {
 					MetaInfo metaInfo = ((MetaTagged)uploadedItem).getMetaInfo();
@@ -176,7 +180,7 @@ public class EditSolutionController extends FormBasicController {
 				logError("", ex);
 			}
 		}
-		
+
 		fireEvent(ureq, Event.DONE_EVENT);
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/EditTaskController.java b/src/main/java/org/olat/course/nodes/gta/ui/EditTaskController.java
index 328b62a4dd8e579a1f4d1c6d134666b55ac3d24c..21ac692a888cb24b5cc2cc0d2f292c298800a5ce 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/EditTaskController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/EditTaskController.java
@@ -35,37 +35,38 @@ 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.FileUtils;
 import org.olat.core.util.StringHelper;
 import org.olat.course.nodes.gta.model.TaskDefinition;
 
 /**
- * 
+ *
  * Initial date: 24.02.2015<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
 public class EditTaskController extends FormBasicController {
-	
+
 	private TextElement titleEl, descriptionEl;
 	private FileElement fileEl;
-	
+
 	private final boolean replaceFile;
 	private final TaskDefinition task;
 	private final File taskContainer;
-	
+
 	private final String filenameToReplace;
 	private final List<TaskDefinition> currentDefinitions;
-	
+
 	public EditTaskController(UserRequest ureq, WindowControl wControl, File taskContainer,
 			List<TaskDefinition> currentDefinitions) {
 		this(ureq, wControl, new TaskDefinition(), taskContainer, currentDefinitions, false);
 	}
-	
+
 	public EditTaskController(UserRequest ureq, WindowControl wControl, TaskDefinition task, File taskContainer,
 			List<TaskDefinition> currentDefinitions) {
 		this(ureq, wControl, task, taskContainer, currentDefinitions, true);
 	}
-	
+
 	public EditTaskController(UserRequest ureq, WindowControl wControl,
 			TaskDefinition task, File taskContainer,
 			List<TaskDefinition> currentDefinitions, boolean replaceFile) {
@@ -77,11 +78,11 @@ public class EditTaskController extends FormBasicController {
 		this.currentDefinitions = currentDefinitions;
 		initForm(ureq);
 	}
-	
+
 	public TaskDefinition getTask() {
 		return task;
 	}
-	
+
 	public String getFilenameToReplace() {
 		return filenameToReplace;
 	}
@@ -89,15 +90,15 @@ public class EditTaskController extends FormBasicController {
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		formLayout.setElementCssClass("o_sel_course_gta_upload_task_form");
-		
+
 		String title = task.getTitle() == null ? "" : task.getTitle();
 		titleEl = uifactory.addTextElement("title", "task.title", 128, title, formLayout);
 		titleEl.setElementCssClass("o_sel_course_gta_upload_task_title");
 		titleEl.setMandatory(true);
-		
+
 		String description = task.getDescription() == null ? "" : task.getDescription();
 		descriptionEl = uifactory.addTextAreaElement("descr", "task.description", 2048, 10, -1, true, description, formLayout);
-		
+
 		fileEl = uifactory.addFileElement(getWindowControl(), "file", "task.file", formLayout);
 		fileEl.setMandatory(true);
 		fileEl.addActionListener(FormEvent.ONCHANGE);
@@ -107,7 +108,7 @@ public class EditTaskController extends FormBasicController {
 				fileEl.setInitialFile(currentFile);
 			}
 		}
-		
+
 		FormLayoutContainer buttonCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
 		buttonCont.setRootForm(mainForm);
 		formLayout.add(buttonCont);
@@ -119,21 +120,24 @@ public class EditTaskController extends FormBasicController {
 	protected void doDispose() {
 		//
 	}
-	
+
 	@Override
 	protected boolean validateFormLogic(UserRequest ureq) {
 		boolean allOk = true;
-		
+
 		titleEl.clearError();
 		if(!StringHelper.containsNonWhitespace(titleEl.getValue())) {
 			titleEl.setErrorKey("form.mandatory.hover", null);
 			allOk &= false;
 		}
-		
+
 		fileEl.clearError();
 		if(fileEl.getInitialFile() == null && fileEl.getUploadFile() == null) {
 			fileEl.setErrorKey("form.mandatory.hover", null);
 			allOk &= false;
+		} else if (!FileUtils.validateFilename(fileEl.getUploadFileName())) {
+			fileEl.setErrorKey("error.file.invalid", null);
+			allOk = false;
 		} else if(!replaceFile && fileEl.getUploadFile() != null) {
 			String filename = fileEl.getUploadFileName();
 			File target = new File(taskContainer, filename);
@@ -152,7 +156,7 @@ public class EditTaskController extends FormBasicController {
 				}
 			}
 		}
-		
+
 		return allOk & super.validateFormLogic(ureq);
 	}
 
@@ -160,7 +164,7 @@ public class EditTaskController extends FormBasicController {
 	protected void formOK(UserRequest ureq) {
 		task.setTitle(titleEl.getValue());
 		task.setDescription(descriptionEl.getValue());
-		
+
 		if(fileEl.getUploadFile() != null) {
 			if(replaceFile && StringHelper.containsNonWhitespace(task.getFilename())) {
 				int usage = 0;
@@ -171,7 +175,7 @@ public class EditTaskController extends FormBasicController {
 						}
 					}
 				}
-				
+
 				if(usage == 1) {
 					File currentFile = new File(taskContainer, task.getFilename());
 					if(currentFile.exists()) {
@@ -179,7 +183,7 @@ public class EditTaskController extends FormBasicController {
 					}
 				}
 			}
-			
+
 			String filename = fileEl.getUploadFileName();
 			task.setFilename(filename);
 			try {
@@ -190,7 +194,7 @@ public class EditTaskController extends FormBasicController {
 				logError("", ex);
 			}
 		}
-		
+
 		fireEvent(ureq, Event.DONE_EVENT);
 	}