diff --git a/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java b/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java
index 0b0650c3e4d6d7473c305243936d5feebcc921a7..7c44930216e74afa929ea0f04ff707661c98ea6d 100644
--- a/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java
+++ b/src/main/java/org/olat/core/commons/controllers/linkchooser/FileLinkChooserController.java
@@ -128,14 +128,16 @@ public class FileLinkChooserController extends BasicController {
 		// create directory filter combined with suffix filter
 		String[] dirFilters = { "_courseelementdata" };
 		VFSItemFilter customFilter = null;
-		VFSItemFilter dirFilter = new VFSItemExcludePrefixFilter(dirFilters);
+		VFSItemFilter dirFilter = new VFSItemExcludePrefixFilter(dirFilters, true);
 		if (suffixes != null) {
-			VFSItemFileTypeFilter typeFilter = new VFSItemFileTypeFilter(suffixes, uriValidation);
+			VFSItemFileTypeFilter typeFilter = new VFSItemFileTypeFilter(suffixes, true, uriValidation);
 			typeFilter.setCompositeFilter(dirFilter);
 			customFilter = typeFilter;
 		} else {
 			customFilter = dirFilter;
 		}
+		
+		
 		// hide file chooser title, we have our own title
 		fileChooserController = FileChooserUIFactory
 				.createFileChooserControllerWithoutTitle(ureq, getWindowControl(), rootDir,
diff --git a/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java b/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java
index 9acdd0e0d2609176c6468558b61508b96f2af780..fc8de76942a38810a0813d434b1714b4ed3de9be 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponent.java
@@ -59,7 +59,6 @@ import org.olat.core.util.vfs.VFSConstants;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
-import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter;
 import org.olat.core.util.vfs.filters.VFSItemFilter;
 import org.olat.core.util.vfs.filters.VFSSystemItemFilter;
 
@@ -76,15 +75,6 @@ public class FolderComponent extends AbstractComponent {
 	public static final String SORT_DATE = "date";
 	public static final String SORT_REV = "revision";
 	public static final String SORT_LOCK = "lock";
-	
-	// see MessagesEditController
-	// see OLAT-4182/OLAT-4219 and OLAT-4259
-	// the filtering of .nfs is sort of temporary until we make sure that we no longer reference
-	// attached files anywhere at the time of deleting it
-	// likely to be resolved after user logs out, caches get cleared - and if not the server
-	// restart overnight definitely removes those .nfs files.
-	// fxdiff: FXOLAT-333 hide all shadow-files per default
-	public static final String[] ATTACHMENT_EXCLUDE_PREFIXES = new String[]{"."};
 
 	protected boolean sortAsc = true;													// asc or desc?
 	protected String sortCol = "";  													// column to sort
@@ -103,7 +93,7 @@ public class FolderComponent extends AbstractComponent {
 	protected Translator translator;
 	private VFSItemFilter filter;
 	private final DateFormat dateTimeFormat;
-	private VFSItemExcludePrefixFilter exclFilter;
+	private VFSItemFilter exclFilter;
 	private CustomLinkTreeModel customLinkTreeModel;
 	private final VFSContainer externContainerForCopy;
 	
@@ -142,7 +132,7 @@ public class FolderComponent extends AbstractComponent {
 		this.filter = filter;
 		this.customLinkTreeModel = customLinkTreeModel;
 		this.externContainerForCopy = externContainerForCopy;
-		exclFilter = new VFSItemExcludePrefixFilter(ATTACHMENT_EXCLUDE_PREFIXES);
+		exclFilter = new VFSSystemItemFilter();
 		Locale locale = ureq.getLocale();
 		collator = Collator.getInstance(locale);
 		translator = Util.createPackageTranslator(FolderRunController.class, locale);
diff --git a/src/main/java/org/olat/core/util/vfs/filters/VFSItemExcludePrefixFilter.java b/src/main/java/org/olat/core/util/vfs/filters/VFSItemExcludePrefixFilter.java
index 9c281376e218de597983c171f4783382342c09cf..48c0b839a31957f80e4529c805c0f2055b36666c 100644
--- a/src/main/java/org/olat/core/util/vfs/filters/VFSItemExcludePrefixFilter.java
+++ b/src/main/java/org/olat/core/util/vfs/filters/VFSItemExcludePrefixFilter.java
@@ -26,8 +26,8 @@
 
 package org.olat.core.util.vfs.filters;
 
-import java.util.Enumeration;
-import java.util.Hashtable;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.olat.core.util.vfs.VFSItem;
 
@@ -41,13 +41,15 @@ import org.olat.core.util.vfs.VFSItem;
  */
 public class VFSItemExcludePrefixFilter implements VFSItemFilter {
 
-	private Hashtable<String,String> excludedPrefixes = new Hashtable<String,String>();
-
+	private final boolean excludeSystemFiles;
+	private final Map<String,String> excludedPrefixes = new HashMap<>();
+	
 	/**
 	 * Constrtuctor
 	 * @param prefixes 
 	 */
-	public VFSItemExcludePrefixFilter(String[] prefixes) {
+	public VFSItemExcludePrefixFilter(String[] prefixes, boolean excludeSystemFiles) {
+		this.excludeSystemFiles = excludeSystemFiles;
 		for (int i = 0; i < prefixes.length; i++) {
 			addExcludedPrefix(prefixes[i]);
 		}
@@ -68,19 +70,18 @@ public class VFSItemExcludePrefixFilter implements VFSItemFilter {
 		excludedPrefixes.remove(prefix.toLowerCase());
 	}
 
-	/**
-	 * @see org.olat.core.util.vfs.filters.VFSItemFilter#accept(org.olat.core.util.vfs.VFSItem)
-	 */
+	@Override
 	public boolean accept(VFSItem vfsItem) {
 		String name = vfsItem.getName().toLowerCase();
-		Enumeration<String> elements = excludedPrefixes.elements();
-		while (elements.hasMoreElements() ) {
-			String excludedPrefix = elements.nextElement();
+		if(excludeSystemFiles && name.startsWith(".")) {
+			return false;
+		}
+		
+		for(String excludedPrefix : excludedPrefixes.keySet()) {
 			if (name.startsWith(excludedPrefix)) {
 				return false;
 			}
 		}
 		return true;
 	}
-
 }
diff --git a/src/main/java/org/olat/core/util/vfs/filters/VFSItemFileTypeFilter.java b/src/main/java/org/olat/core/util/vfs/filters/VFSItemFileTypeFilter.java
index 74c6c47867a6a203d7c2fbd8e918a93bf80d5ec3..f9478f0874dc1e2b111441d77e25c7b7d49e1e8c 100644
--- a/src/main/java/org/olat/core/util/vfs/filters/VFSItemFileTypeFilter.java
+++ b/src/main/java/org/olat/core/util/vfs/filters/VFSItemFileTypeFilter.java
@@ -21,7 +21,7 @@
 package org.olat.core.util.vfs.filters;
 
 import java.net.URI;
-import java.util.Hashtable;
+import java.util.HashMap;
 import java.util.Map;
 
 import org.olat.core.util.vfs.VFSContainer;
@@ -37,15 +37,17 @@ import org.olat.core.util.vfs.VFSItem;
 public class VFSItemFileTypeFilter extends VFSItemCompositeFilter {
 	
 	private final boolean uriValidation;
-	private Map<String, String> fileTypes = new Hashtable<String, String>();
+	private final boolean excludeSystemFiles;
+	private Map<String, String> fileTypes = new HashMap<>();
 
 	/**
 	 * Constrtuctor
 	 * 
 	 * @param filetypes
 	 */
-	public VFSItemFileTypeFilter(String[] fileTypes, boolean uriValidation) {
+	public VFSItemFileTypeFilter(String[] fileTypes, boolean excludeSystemFiles, boolean uriValidation) {
 		this.uriValidation = uriValidation;
+		this.excludeSystemFiles = excludeSystemFiles;
 		for (int i = 0; i < fileTypes.length; i++) {
 			addFileType(fileTypes[i]);
 		}
@@ -66,9 +68,6 @@ public class VFSItemFileTypeFilter extends VFSItemCompositeFilter {
 		fileTypes.remove(fileType.toLowerCase());
 	}
 
-	/**
-	 * @see org.olat.core.util.vfs.filters.VFSItemCompositeFilter#acceptFilter(VFSItem)
-	 */
 	@Override
 	public boolean acceptFilter(VFSItem vfsItem) {
 		if (vfsItem instanceof VFSContainer) {
@@ -84,8 +83,12 @@ public class VFSItemFileTypeFilter extends VFSItemCompositeFilter {
 			}
 		}
 		
+		if(excludeSystemFiles && name.startsWith(".")) {
+			return false;
+		}
+		
 		name = name.toLowerCase();
-		int dotPos = name.lastIndexOf(".");
+		int dotPos = name.lastIndexOf('.');
 		if (dotPos == -1) return false;
 		return fileTypes.containsKey(name.substring(dotPos + 1));
 	}
diff --git a/src/main/java/org/olat/course/nodes/pf/manager/CountingCallback.java b/src/main/java/org/olat/course/nodes/pf/manager/CountingCallback.java
index 121ce465943ae22e6a9f603dd94a66ccb5454312..74dd24afeafc09bd006f9346f283589d5c8d1579 100644
--- a/src/main/java/org/olat/course/nodes/pf/manager/CountingCallback.java
+++ b/src/main/java/org/olat/course/nodes/pf/manager/CountingCallback.java
@@ -21,14 +21,13 @@ package org.olat.course.nodes.pf.manager;
 
 import java.util.List;
 
-import org.olat.core.commons.modules.bc.components.FolderComponent;
 import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.util.vfs.Quota;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
-import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter;
 import org.olat.core.util.vfs.filters.VFSItemFilter;
+import org.olat.core.util.vfs.filters.VFSSystemItemFilter;
 /**
 *
 * @author Fabian Kiefer, fabian.kiefer@frentix.com, http://www.frentix.com
@@ -36,7 +35,7 @@ import org.olat.core.util.vfs.filters.VFSItemFilter;
 */
 public class CountingCallback implements VFSSecurityCallback {
 	
-	private static final VFSItemFilter attachmentExcludeFilter = new VFSItemExcludePrefixFilter(FolderComponent.ATTACHMENT_EXCLUDE_PREFIXES);
+	private static final VFSItemFilter attachmentExcludeFilter = new VFSSystemItemFilter();
 
 	private SubscriptionContext subsContext;
 	private VFSContainer dropbox;
diff --git a/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java b/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java
index 8274c7f56fe5fd9df46b36cc9f15ce22e4ad0b7d..4c8d6f962e695007096da693cf0a6363b2bb75fb 100644
--- a/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java
+++ b/src/main/java/org/olat/course/nodes/pf/manager/PFManager.java
@@ -37,7 +37,6 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.olat.basesecurity.GroupRoles;
-import org.olat.core.commons.modules.bc.components.FolderComponent;
 import org.olat.core.commons.services.notifications.SubscriptionContext;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
@@ -54,8 +53,8 @@ import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSManager;
 import org.olat.core.util.vfs.VirtualContainer;
 import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
-import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter;
 import org.olat.core.util.vfs.filters.VFSItemFilter;
+import org.olat.core.util.vfs.filters.VFSSystemItemFilter;
 import org.olat.course.CourseModule;
 import org.olat.course.nodes.PFCourseNode;
 import org.olat.course.nodes.pf.ui.DropBoxRow;
@@ -86,7 +85,7 @@ import org.springframework.stereotype.Service;
 public class PFManager {
 	
 	private static final OLog log = Tracing.createLoggerFor(PFManager.class);
-	private static final VFSItemFilter attachmentExcludeFilter = new VFSItemExcludePrefixFilter(FolderComponent.ATTACHMENT_EXCLUDE_PREFIXES);
+	private static final VFSItemFilter attachmentExcludeFilter = new VFSSystemItemFilter();
 
 	public static final String FILENAME_PARTICIPANTFOLDER = "participantfolder";
 	public static final String FILENAME_RETURNBOX = "returnbox";
diff --git a/src/main/java/org/olat/course/nodes/pf/ui/PFPeekviewController.java b/src/main/java/org/olat/course/nodes/pf/ui/PFPeekviewController.java
index a546bf56a005326f677a0c2f163968855c1c4216..7e2e58202c346e9ca67f3d20318fb93dc55e25b2 100644
--- a/src/main/java/org/olat/course/nodes/pf/ui/PFPeekviewController.java
+++ b/src/main/java/org/olat/course/nodes/pf/ui/PFPeekviewController.java
@@ -27,7 +27,6 @@ import java.util.List;
 
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.modules.bc.FolderModule;
-import org.olat.core.commons.modules.bc.components.FolderComponent;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.download.DownloadComponent;
@@ -44,8 +43,8 @@ import org.olat.core.util.vfs.LocalFileImpl;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
-import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter;
 import org.olat.core.util.vfs.filters.VFSItemFilter;
+import org.olat.core.util.vfs.filters.VFSSystemItemFilter;
 /**
 *
 * @author Fabian Kiefer, fabian.kiefer@frentix.com, http://www.frentix.com
@@ -61,7 +60,7 @@ public class PFPeekviewController extends BasicController implements Controller
 	// the current course node id
 	private final String nodeId;
 
-	private static final VFSItemFilter attachmentExcludeFilter = new VFSItemExcludePrefixFilter(FolderComponent.ATTACHMENT_EXCLUDE_PREFIXES);
+	private static final VFSItemFilter attachmentExcludeFilter = new VFSSystemItemFilter();
 
 	public PFPeekviewController(UserRequest ureq, WindowControl wControl, VFSContainer rootFolder, String nodeId, int itemsToDisplay) {
 		super(ureq, wControl);
@@ -69,14 +68,14 @@ public class PFPeekviewController extends BasicController implements Controller
 
 		VelocityContainer peekviewVC = createVelocityContainer("peekview");
 		// add items, only as many as configured
-		List<VFSLeaf> allLeafs = new ArrayList<VFSLeaf>();
+		List<VFSLeaf> allLeafs = new ArrayList<>();
 		addItems(rootFolder, allLeafs);
 		// Sort messages by last modified date
 		Collections.sort(allLeafs, dateSortingComparator);
 		boolean forceDownload = CoreSpringFactory.getImpl(FolderModule.class).isForceDownload();
 		
 		// only take the configured amount of messages
-		List<VFSLeaf> leafs = new ArrayList<VFSLeaf>();
+		List<VFSLeaf> leafs = new ArrayList<>();
 		for (int i = 0; i < allLeafs.size(); i++) {
 			if (leafs.size() == itemsToDisplay) {
 				break;
@@ -103,8 +102,6 @@ public class PFPeekviewController extends BasicController implements Controller
 		putInitialPanel(peekviewVC);
 	}
 
-	
-
 	@Override
 	protected void event(UserRequest ureq, Component source, Event event) {
 		if (source instanceof Link) {
@@ -120,7 +117,7 @@ public class PFPeekviewController extends BasicController implements Controller
 
 	@Override
 	protected void doDispose() {
-
+		//
 	}
 	
 	private void addItems(VFSContainer container, List<VFSLeaf> allLeafs) {
@@ -139,6 +136,4 @@ public class PFPeekviewController extends BasicController implements Controller
 			}
 		}
 	}
-
-
 }
diff --git a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFileChooserController.java b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFileChooserController.java
index b30376e127049a3f955536e8494ac666ce8db17d..ce8e7929ee714e119c73c30c692346db958169de 100644
--- a/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFileChooserController.java
+++ b/src/main/java/org/olat/gui/demo/guidemo/GuiDemoFileChooserController.java
@@ -37,8 +37,8 @@ import org.olat.core.util.vfs.LocalFolderImpl;
 import org.olat.core.util.vfs.LocalImpl;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
-import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter;
 import org.olat.core.util.vfs.filters.VFSItemFilter;
+import org.olat.core.util.vfs.filters.VFSSystemItemFilter;
 
 /**
  * Description:<br>
@@ -68,7 +68,7 @@ public class GuiDemoFileChooserController extends BasicController {
 		webappRootFile = new File(WebappHelper.getContextRealPath("/static"));
 		VFSContainer webappRoot = new LocalFolderImpl(webappRootFile);	
 		// don't show cvs and hidden files meta files
-		VFSItemFilter filter = new VFSItemExcludePrefixFilter(new String[]{"CVS","cvs", "."});
+		VFSItemFilter filter = new VFSSystemItemFilter();
 		// create file chooser with the filter and the web app root
 		chooserCtr = FileChooserUIFactory.createFileChooserController(ureq, getWindowControl(), webappRoot, filter, false);
 		listenTo(chooserCtr);		
diff --git a/src/main/java/org/olat/ims/cp/objects/CPFile.java b/src/main/java/org/olat/ims/cp/objects/CPFile.java
index 4d5e0b08600c916c96dac94fd0946e118d9d7ccb..127904c45176dec1eaaeaa8a18026f10b8622c65 100644
--- a/src/main/java/org/olat/ims/cp/objects/CPFile.java
+++ b/src/main/java/org/olat/ims/cp/objects/CPFile.java
@@ -36,8 +36,8 @@ import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSManager;
-import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter;
 import org.olat.core.util.vfs.filters.VFSItemFilter;
+import org.olat.core.util.vfs.filters.VFSSystemItemFilter;
 import org.olat.fileresource.FileResourceManager;
 import org.olat.ims.cp.CPCore;
 
@@ -169,8 +169,7 @@ public class CPFile extends DefaultElement implements CPNode {
 	 * @param parentContainer
 	 */
 	private void deleteIfEmpty(VFSContainer container) {
-		String[] unwantedPrefixes = { "." };
-		VFSItemFilter filter = new VFSItemExcludePrefixFilter(unwantedPrefixes);
+		VFSItemFilter filter = new VFSSystemItemFilter();
 		if (container != null) {
 			List<VFSItem> items = container.getItems(filter);
 			if (items == null || items.isEmpty()) {
diff --git a/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java b/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java
index 146f8a34e50ae1a93cfb3c1a0be3f18e84fa5d22..08f54b30ac799420ad3ea0141aef1a4e3d9d94d1 100644
--- a/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java
+++ b/src/main/java/org/olat/ims/cp/ui/CPFileImportController.java
@@ -48,8 +48,8 @@ import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.VFSManager;
-import org.olat.core.util.vfs.filters.VFSItemExcludePrefixFilter;
 import org.olat.core.util.vfs.filters.VFSItemFilter;
+import org.olat.core.util.vfs.filters.VFSSystemItemFilter;
 import org.olat.ims.cp.CPManager;
 import org.olat.ims.cp.ContentPackage;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -66,8 +66,7 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 public class CPFileImportController extends FormBasicController {
 	private static final String ALL = "all";
-	private static final String[] prefixes = new String[] { "." };
-	private static final VFSItemFilter excludeMetaFilesFilter = new VFSItemExcludePrefixFilter(prefixes);
+	private static final VFSItemFilter excludeMetaFilesFilter = new VFSSystemItemFilter();
 
 	private FileElement file;
 	private FormLink cancelButton;