From 670722d2cbc189c16c1b5bead0b374e2e0d586e6 Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Mon, 8 Apr 2019 11:01:01 +0200
Subject: [PATCH] OO-3929: Refactoring to encaplusate a document editor service

---
 .../commons/editor/fileeditor/FileEditor.java |  10 +-
 .../fileeditor/FileEditorController.java      |  10 +-
 .../editor/htmleditor/HTMLEditorConfig.java   |   4 +-
 .../modules/bc/commands/CmdCreateFile.java    |  33 +++---
 .../modules/bc/commands/CmdOpenContent.java   |  28 ++---
 .../modules/bc/components/ListRenderer.java   |  11 +-
 .../services/_spring/servicesCorecontext.xml  |  19 +++
 .../ContentProvider.java                      |   2 +-
 .../ContentProviderFactory.java               |   2 +-
 .../DocEditor.java}                           |   6 +-
 .../DocEditorConfigs.java}                    |  14 +--
 .../DocEditorSecurityCallback.java}           |   6 +-
 .../DocEditorSecurityCallbackBuilder.java}    |  24 ++--
 .../DocTemplate.java}                         |  10 +-
 .../DocTemplates.java}                        |  67 ++++++-----
 .../doceditor/DocumentEditorService.java      |  75 ++++++++++++
 .../doceditor}/collabora/CollaboraEditor.java |  14 +--
 .../doceditor}/collabora/CollaboraModule.java |   2 +-
 .../CollaboraRefreshDiscoveryEvent.java       |   2 +-
 .../collabora/CollaboraService.java           |  12 +-
 .../manager/CollaboraServiceImpl.java         |  24 ++--
 .../collabora/restapi/CheckFileInfoVO.java    |   2 +-
 .../collabora/restapi/FilesWebService.java    |  12 +-
 .../collabora/restapi/PutFileVO.java          |   2 +-
 .../ui/CollaboraAdminController.java          |  14 +--
 .../ui/CollaboraEditorController.java         |  18 +--
 .../ui/CollaboraEditorUrlBuilder.java         |   4 +-
 .../collabora/ui/CollaboraUIFactory.java      |   2 +-
 .../collabora/ui/_content/collabora.html      |   0
 .../ui/_i18n/LocalStrings_de.properties       |   0
 .../ui/_i18n/LocalStrings_en.properties       |   0
 .../{filetemplate => doceditor}/empty.pptx    | Bin
 .../manager/DocumentEditorServiceImpl.java    |  88 ++++++++++++++
 .../ui/CreateDocumentController.java}         | 108 +++++++++---------
 .../ui/DocEditorConfigController.java}        |  46 ++++----
 .../ui/DocEditorController.java}              |  34 +++---
 .../ui/DocEditorFullscreenController.java}    |  22 ++--
 .../ui/DocEditorSelectionEvent.java}          |  12 +-
 .../ui/_content/create_document.html}         |   2 +-
 .../doceditor/ui/_content/editor_config.html  |  18 +++
 .../doceditor/ui/_content/editor_main.html    |  10 ++
 .../ui/_i18n/LocalStrings_de.properties       |  12 ++
 .../ui/_i18n/LocalStrings_en.properties       |  12 ++
 .../services/doceditor}/wopi/Access.java      |   2 +-
 .../services/doceditor}/wopi/Action.java      |   2 +-
 .../commons/services/doceditor}/wopi/App.java |   2 +-
 .../services/doceditor}/wopi/Discovery.java   |   2 +-
 .../services/doceditor}/wopi/NetZone.java     |   2 +-
 .../services/doceditor}/wopi/ProofKey.java    |   2 +-
 .../doceditor}/wopi/WopiDiscoveryClient.java  |   2 +-
 .../doceditor}/wopi/WopiRestHelper.java       |   2 +-
 .../services/doceditor}/wopi/WopiService.java |   6 +-
 .../wopi/manager/WopiDiscoveryClientImpl.java |   8 +-
 .../wopi/manager/WopiServiceImpl.java         |  22 ++--
 .../doceditor}/wopi/manager/WopiXStream.java  |  12 +-
 .../doceditor}/wopi/model/AccessImpl.java     |   4 +-
 .../doceditor}/wopi/model/ActionImpl.java     |   4 +-
 .../doceditor}/wopi/model/AppImpl.java        |   6 +-
 .../doceditor}/wopi/model/DiscoveryImpl.java  |   8 +-
 .../doceditor}/wopi/model/NetZoneImpl.java    |   6 +-
 .../doceditor}/wopi/model/ProofKeyImpl.java   |   4 +-
 .../ui/_i18n/LocalStrings_de.properties       |  11 --
 .../ui/_i18n/LocalStrings_en.properties       |  11 --
 .../services/vfs/VFSRepositoryService.java    |  42 -------
 .../vfs/manager/VFSRepositoryServiceImpl.java |  47 --------
 .../ui/AbstractAssignmentEditController.java  |  43 +++----
 .../ui/GTASampleSolutionsEditController.java  |  41 +++----
 .../course/nodes/gta/ui/GTAUIFactory.java     |  41 ++++---
 .../nodes/gta/ui/NewDocumentController.java   |  52 ++++-----
 .../nodes/gta/ui/NewSolutionController.java   |  56 ++++-----
 .../nodes/gta/ui/NewTaskController.java       |  56 ++++-----
 .../olat/course/nodes/gta/ui/SolutionRow.java |   2 +-
 .../gta/ui/SubmitDocumentsController.java     |  46 +++-----
 .../nodes/gta/ui/TaskDefinitionRow.java       |   2 +-
 .../gta/ui/component/ModeCellRenderer.java    |   2 +-
 .../olat/modules/_spring/modulesContext.xml   |  20 ----
 .../portfolio/handler/CreateFileHandler.java  |  22 ++--
 .../portfolio/ui/MediaCenterController.java   |   8 +-
 .../portfolio/ui/PageRunController.java       |  14 +--
 .../ui/_i18n/LocalStrings_de.properties       |   6 +-
 .../ui/_i18n/LocalStrings_en.properties       |   6 +-
 .../ui/media/CreateFileMediaController.java   |  30 ++---
 .../ui/media/FileMediaController.java         |  37 +++---
 ...egate.java => DocumentEditorDelegate.java} |  26 ++---
 ...e.java => DocumentEditorDelegateType.java} |   2 +-
 .../handlers/ExcelVFSEditorDelegateType.java  |   4 +-
 .../PowerPointVFSEditorDelegateType.java      |   4 +-
 .../handlers/RepositoryHandlerFactory.java    |   6 +-
 .../handlers/WordVFSEditorDelegateType.java   |   4 +-
 .../ui/WebDocumentRunController.java          |  20 ++--
 .../wopi/manager/WopiServiceImplTest.java     |  17 +--
 .../wopi/manager/WopiXStreamTest.java         |  13 ++-
 .../wopi/manager/discovery_collabora.xml      |   0
 .../wopi/manager/discovery_microsoft.xml      |   0
 .../java/org/olat/test/AllTestsJunit4.java    |   4 +-
 95 files changed, 840 insertions(+), 744 deletions(-)
 rename src/main/java/org/olat/core/commons/services/{filetemplate => doceditor}/ContentProvider.java (95%)
 rename src/main/java/org/olat/core/commons/services/{filetemplate => doceditor}/ContentProviderFactory.java (98%)
 rename src/main/java/org/olat/core/commons/services/{vfs/VFSLeafEditor.java => doceditor/DocEditor.java} (92%)
 rename src/main/java/org/olat/core/commons/services/{vfs/VFSLeafEditorConfigs.java => doceditor/DocEditorConfigs.java} (81%)
 rename src/main/java/org/olat/core/commons/services/{vfs/VFSLeafEditorSecurityCallback.java => doceditor/DocEditorSecurityCallback.java} (86%)
 rename src/main/java/org/olat/core/commons/services/{vfs/VFSLeafEditorSecurityCallbackBuilder.java => doceditor/DocEditorSecurityCallbackBuilder.java} (76%)
 rename src/main/java/org/olat/core/commons/services/{filetemplate/FileType.java => doceditor/DocTemplate.java} (80%)
 rename src/main/java/org/olat/core/commons/services/{filetemplate/FileTypes.java => doceditor/DocTemplates.java} (50%)
 create mode 100644 src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/CollaboraEditor.java (83%)
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/CollaboraModule.java (97%)
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/CollaboraRefreshDiscoveryEvent.java (95%)
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/CollaboraService.java (85%)
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/manager/CollaboraServiceImpl.java (88%)
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/restapi/CheckFileInfoVO.java (99%)
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/restapi/FilesWebService.java (94%)
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/restapi/PutFileVO.java (96%)
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/ui/CollaboraAdminController.java (89%)
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/ui/CollaboraEditorController.java (83%)
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/ui/CollaboraEditorUrlBuilder.java (95%)
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/ui/CollaboraUIFactory.java (95%)
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/ui/_content/collabora.html (100%)
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/ui/_i18n/LocalStrings_de.properties (100%)
 rename src/main/java/org/olat/{modules/wopi => core/commons/services/doceditor}/collabora/ui/_i18n/LocalStrings_en.properties (100%)
 rename src/main/java/org/olat/core/commons/services/{filetemplate => doceditor}/empty.pptx (100%)
 create mode 100644 src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java
 rename src/main/java/org/olat/core/commons/services/{filetemplate/ui/CreateFileController.java => doceditor/ui/CreateDocumentController.java} (59%)
 rename src/main/java/org/olat/core/commons/services/{vfs/ui/editor/VFSLeafConfigController.java => doceditor/ui/DocEditorConfigController.java} (72%)
 rename src/main/java/org/olat/core/commons/services/{vfs/ui/editor/VFSLeafEditorController.java => doceditor/ui/DocEditorController.java} (70%)
 rename src/main/java/org/olat/core/commons/services/{vfs/ui/editor/VFSLeafEditorFullscreenController.java => doceditor/ui/DocEditorFullscreenController.java} (75%)
 rename src/main/java/org/olat/core/commons/services/{vfs/ui/editor/VFSEditorSelectionEvent.java => doceditor/ui/DocEditorSelectionEvent.java} (79%)
 rename src/main/java/org/olat/core/commons/services/{filetemplate/ui/_content/create_file.html => doceditor/ui/_content/create_document.html} (82%)
 create mode 100644 src/main/java/org/olat/core/commons/services/doceditor/ui/_content/editor_config.html
 create mode 100644 src/main/java/org/olat/core/commons/services/doceditor/ui/_content/editor_main.html
 create mode 100644 src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties
 create mode 100644 src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/Access.java (95%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/Action.java (95%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/App.java (95%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/Discovery.java (95%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/NetZone.java (94%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/ProofKey.java (95%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/WopiDiscoveryClient.java (95%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/WopiRestHelper.java (96%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/WopiService.java (90%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/manager/WopiDiscoveryClientImpl.java (90%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/manager/WopiServiceImpl.java (86%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/manager/WopiXStream.java (88%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/model/AccessImpl.java (94%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/model/ActionImpl.java (93%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/model/AppImpl.java (90%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/model/DiscoveryImpl.java (84%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/model/NetZoneImpl.java (87%)
 rename src/main/java/org/olat/{modules => core/commons/services/doceditor}/wopi/model/ProofKeyImpl.java (94%)
 delete mode 100644 src/main/java/org/olat/core/commons/services/filetemplate/ui/_i18n/LocalStrings_de.properties
 delete mode 100644 src/main/java/org/olat/core/commons/services/filetemplate/ui/_i18n/LocalStrings_en.properties
 rename src/main/java/org/olat/repository/handlers/{VFSEditorDelegate.java => DocumentEditorDelegate.java} (79%)
 rename src/main/java/org/olat/repository/handlers/{VFSEditorDelegateType.java => DocumentEditorDelegateType.java} (96%)
 rename src/test/java/org/olat/{modules => core/commons/services/doceditor}/wopi/manager/WopiServiceImplTest.java (78%)
 rename src/test/java/org/olat/{modules => core/commons/services/doceditor}/wopi/manager/WopiXStreamTest.java (90%)
 rename src/test/java/org/olat/{modules => core/commons/services/doceditor}/wopi/manager/discovery_collabora.xml (100%)
 rename src/test/java/org/olat/{modules => core/commons/services/doceditor}/wopi/manager/discovery_microsoft.xml (100%)

diff --git a/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java b/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java
index 3bec91a5c74..74b696fb196 100644
--- a/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java
+++ b/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java
@@ -23,9 +23,9 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor;
-import org.olat.core.commons.services.vfs.VFSLeafEditorConfigs;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditor;
+import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
@@ -45,7 +45,7 @@ import org.springframework.stereotype.Service;
  *
  */
 @Service
-public class FileEditor implements VFSLeafEditor {
+public class FileEditor implements DocEditor {
 	
 	private static final List<String> HTML_EDITOR_SUFFIX = Arrays.asList("html", "htm");
 	private static final List<String> TEXT_EDITOR_SUFFIX = Arrays.asList("txt", "css", "csv");
@@ -85,7 +85,7 @@ public class FileEditor implements VFSLeafEditor {
 
 	@Override
 	public Controller getRunController(UserRequest ureq, WindowControl wControl, Identity identity, VFSLeaf vfsLeaf,
-			VFSLeafEditorSecurityCallback secCallback, VFSLeafEditorConfigs configs) {
+			DocEditorSecurityCallback secCallback, DocEditorConfigs configs) {
 		return new FileEditorController(ureq, wControl, vfsLeaf, secCallback, configs);
 	}
 
diff --git a/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditorController.java b/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditorController.java
index bcdaea568f0..3e3c91feebc 100644
--- a/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditorController.java
+++ b/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditorController.java
@@ -32,10 +32,10 @@ import org.olat.core.commons.editor.htmleditor.HTMLEditorController;
 import org.olat.core.commons.editor.htmleditor.HTMLReadOnlyController;
 import org.olat.core.commons.editor.htmleditor.WysiwygFactory;
 import org.olat.core.commons.editor.plaintexteditor.TextEditorController;
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
-import org.olat.core.commons.services.vfs.VFSLeafEditorConfigs;
-import org.olat.core.commons.services.vfs.VFSLeafEditorConfigs.Config;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocEditorConfigs.Config;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.velocity.VelocityContainer;
@@ -64,7 +64,7 @@ public class FileEditorController extends BasicController {
 	private VFSLockManager vfsLockManager;
 
 	protected FileEditorController(UserRequest ureq, WindowControl wControl, VFSLeaf vfsLeaf,
-			VFSLeafEditorSecurityCallback secCallback, VFSLeafEditorConfigs configs) {
+			DocEditorSecurityCallback secCallback, DocEditorConfigs configs) {
 		super(ureq, wControl);
 		this.vfsLeaf = vfsLeaf;
 		
diff --git a/src/main/java/org/olat/core/commons/editor/htmleditor/HTMLEditorConfig.java b/src/main/java/org/olat/core/commons/editor/htmleditor/HTMLEditorConfig.java
index d531932b36c..3663af3cd2a 100644
--- a/src/main/java/org/olat/core/commons/editor/htmleditor/HTMLEditorConfig.java
+++ b/src/main/java/org/olat/core/commons/editor/htmleditor/HTMLEditorConfig.java
@@ -20,7 +20,7 @@
 package org.olat.core.commons.editor.htmleditor;
 
 import org.olat.core.commons.controllers.linkchooser.CustomLinkTreeModel;
-import org.olat.core.commons.services.vfs.VFSLeafEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorConfigs;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.modules.edusharing.VFSEdusharingProvider;
 
@@ -30,7 +30,7 @@ import org.olat.modules.edusharing.VFSEdusharingProvider;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class HTMLEditorConfig implements VFSLeafEditorConfigs.Config {
+public class HTMLEditorConfig implements DocEditorConfigs.Config {
 
 	public static final String TYPE = "oo-html-editor";
 	
diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java
index 231b5055275..65bdd8ede22 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java
@@ -31,21 +31,22 @@ import org.olat.core.commons.editor.htmleditor.HTMLEditorConfig;
 import org.olat.core.commons.modules.bc.FolderEvent;
 import org.olat.core.commons.modules.bc.FolderLicenseHandler;
 import org.olat.core.commons.modules.bc.components.FolderComponent;
-import org.olat.core.commons.services.filetemplate.FileTypes;
-import org.olat.core.commons.services.filetemplate.ui.CreateFileController;
+import org.olat.core.commons.services.doceditor.DocTemplates;
+import org.olat.core.commons.services.doceditor.DocEditor;
+import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallbackBuilder;
+import org.olat.core.commons.services.doceditor.DocumentEditorService;
+import org.olat.core.commons.services.doceditor.ui.CreateDocumentController;
+import org.olat.core.commons.services.doceditor.ui.DocEditorFullscreenController;
 import org.olat.core.commons.services.license.License;
 import org.olat.core.commons.services.license.LicenseModule;
 import org.olat.core.commons.services.license.LicenseService;
 import org.olat.core.commons.services.license.ui.LicenseUIFactory;
 import org.olat.core.commons.services.notifications.NotificationsManager;
 import org.olat.core.commons.services.notifications.SubscriptionContext;
-import org.olat.core.commons.services.vfs.VFSLeafEditor;
-import org.olat.core.commons.services.vfs.VFSLeafEditorConfigs;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallbackBuilder;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.commons.services.vfs.VFSRepositoryService;
-import org.olat.core.commons.services.vfs.ui.editor.VFSLeafEditorFullscreenController;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.control.Controller;
@@ -77,7 +78,7 @@ public class CmdCreateFile extends BasicController implements FolderCommand {
 	private String fileName;
 	
 	private CloseableModalController cmc;
-	private CreateFileController createCtrl;
+	private CreateDocumentController createCtrl;
 	private Controller editorCtr;
 	private FolderComponent folderComponent;
 	
@@ -91,6 +92,8 @@ public class CmdCreateFile extends BasicController implements FolderCommand {
 	private FolderLicenseHandler licenseHandler;
 	@Autowired
 	private VFSRepositoryService vfsRepositoryService;
+	@Autowired
+	private DocumentEditorService docEditorService;
 
 	protected CmdCreateFile(UserRequest ureq, WindowControl wControl) {
 		super(ureq, wControl);
@@ -113,8 +116,8 @@ public class CmdCreateFile extends BasicController implements FolderCommand {
 			return null;
 		}
 		
-		FileTypes fileTypes = FileTypes.editables(getLocale()).build();
-		createCtrl = new CreateFileController(ureq, wControl, folderComponent.getCurrentContainer(), fileTypes);
+		DocTemplates docTemplates = DocTemplates.editables(getLocale()).build();
+		createCtrl = new CreateDocumentController(ureq, wControl, folderComponent.getCurrentContainer(), docTemplates);
 		listenTo(createCtrl);
 		
 		cmc = new CloseableModalController(getWindowControl(), translate("close"), createCtrl.getInitialComponent(),
@@ -181,7 +184,7 @@ public class CmdCreateFile extends BasicController implements FolderCommand {
 	
 	private void doEdit(UserRequest ureq) {
 		String suffix = FileUtils.getFileSuffix(vfsLeaf.getName());
-		List<VFSLeafEditor> editors = vfsRepositoryService.getEditors(suffix, VFSLeafEditor.Mode.EDIT);
+		List<DocEditor> editors = docEditorService.getEditors(suffix, DocEditor.Mode.EDIT);
 		// Not able to decide which editor to use -> show the folder list
 		if (editors.size() != 1) {
 			fireEvent(ureq, new FolderEvent(FolderEvent.NEW_FILE_EVENT, fileName));
@@ -189,15 +192,15 @@ public class CmdCreateFile extends BasicController implements FolderCommand {
 			return;
 		}
 		
-		VFSLeafEditorSecurityCallback secCallback = VFSLeafEditorSecurityCallbackBuilder.builder()
-				.withMode(VFSLeafEditor.Mode.EDIT)
+		DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder()
+				.withMode(DocEditor.Mode.EDIT)
 				.withVersionControlled(true)
 				.build();
 		HTMLEditorConfig htmlEditorConfig = getHtmlEditorConfig();
-		VFSLeafEditorConfigs configs = VFSLeafEditorConfigs.builder()
+		DocEditorConfigs configs = DocEditorConfigs.builder()
 				.addConfig(htmlEditorConfig)
 				.build();
-		editorCtr = new VFSLeafEditorFullscreenController(ureq, getWindowControl(), vfsLeaf, secCallback, configs);
+		editorCtr = new DocEditorFullscreenController(ureq, getWindowControl(), vfsLeaf, secCallback, configs);
 		listenTo(editorCtr);
 	}
 
diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java
index 86ce31a7045..95f798b810d 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java
@@ -22,14 +22,14 @@ package org.olat.core.commons.modules.bc.commands;
 import org.olat.core.commons.editor.htmleditor.HTMLEditorConfig;
 import org.olat.core.commons.modules.bc.components.FolderComponent;
 import org.olat.core.commons.modules.bc.components.ListRenderer;
+import org.olat.core.commons.services.doceditor.DocEditor;
+import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallbackBuilder;
+import org.olat.core.commons.services.doceditor.DocumentEditorService;
+import org.olat.core.commons.services.doceditor.ui.DocEditorFullscreenController;
 import org.olat.core.commons.services.notifications.NotificationsManager;
 import org.olat.core.commons.services.notifications.SubscriptionContext;
-import org.olat.core.commons.services.vfs.VFSLeafEditor;
-import org.olat.core.commons.services.vfs.VFSLeafEditorConfigs;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallbackBuilder;
-import org.olat.core.commons.services.vfs.VFSRepositoryService;
-import org.olat.core.commons.services.vfs.ui.editor.VFSLeafEditorFullscreenController;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.control.Controller;
@@ -61,7 +61,7 @@ public class CmdOpenContent extends BasicController implements FolderCommand {
 	private Controller editCtrl;
 	
 	@Autowired
-	private VFSRepositoryService vfsService;
+	private DocumentEditorService docEditorService;
 	
 	protected CmdOpenContent(UserRequest ureq, WindowControl wControl) {
 		super(ureq, wControl);
@@ -105,25 +105,25 @@ public class CmdOpenContent extends BasicController implements FolderCommand {
 		VFSLeaf vfsLeaf = (VFSLeaf) currentItem;
 		VFSContainer container = VFSManager.findInheritingSecurityCallbackContainer(folderComponent.getCurrentContainer());
 		VFSSecurityCallback containerSecCallback = container.getLocalSecurityCallback();
-		VFSLeafEditorSecurityCallback secCallback = VFSLeafEditorSecurityCallbackBuilder.builder()
+		DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder()
 				.withMode(getMode(vfsLeaf, containerSecCallback.canWrite()))
 				.withVersionControlled(true)
 				.build();
 		HTMLEditorConfig htmlEditorConfig = getHtmlEditorConfig(vfsLeaf);
-		VFSLeafEditorConfigs configs = VFSLeafEditorConfigs.builder()
+		DocEditorConfigs configs = DocEditorConfigs.builder()
 				.addConfig(htmlEditorConfig)
 				.build();
-		editCtrl = new VFSLeafEditorFullscreenController(ureq, getWindowControl(), vfsLeaf, secCallback, configs);
+		editCtrl = new DocEditorFullscreenController(ureq, getWindowControl(), vfsLeaf, secCallback, configs);
 		listenTo(editCtrl);
 		
 		return this;
 	}
 	
-	private VFSLeafEditor.Mode getMode(VFSLeaf vfsLeaf, boolean canWrite) {
-		if (canWrite && vfsService.hasEditor(vfsLeaf, VFSLeafEditor.Mode.EDIT, getIdentity())) {
-			return VFSLeafEditor.Mode.EDIT;
+	private DocEditor.Mode getMode(VFSLeaf vfsLeaf, boolean canWrite) {
+		if (canWrite && docEditorService.hasEditor(vfsLeaf, DocEditor.Mode.EDIT, getIdentity())) {
+			return DocEditor.Mode.EDIT;
 		}
-		return VFSLeafEditor.Mode.VIEW;
+		return DocEditor.Mode.VIEW;
 	}
 	
 	private HTMLEditorConfig getHtmlEditorConfig(VFSLeaf vfsLeaf) {
diff --git a/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java b/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java
index ef2009f6ea4..fd7e28d4a7d 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java
@@ -37,11 +37,12 @@ import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.modules.bc.FileSelection;
 import org.olat.core.commons.modules.bc.FolderLicenseHandler;
 import org.olat.core.commons.modules.bc.FolderManager;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocumentEditorService;
 import org.olat.core.commons.services.license.License;
 import org.olat.core.commons.services.license.LicenseHandler;
 import org.olat.core.commons.services.license.LicenseModule;
 import org.olat.core.commons.services.license.ui.LicenseRenderer;
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.commons.services.vfs.VFSRepositoryService;
 import org.olat.core.commons.services.vfs.VFSVersionModule;
@@ -96,6 +97,7 @@ public class ListRenderer {
 	private VFSRepositoryService vfsRepositoryService;
 	private VFSVersionModule vfsVersionModule;
 	private VFSLockManager lockManager;
+	private DocumentEditorService docEditorService;
 	private UserManager userManager;
 	boolean licensesEnabled ;
  	
@@ -129,6 +131,9 @@ public class ListRenderer {
 		if(vfsVersionModule == null) {
 			vfsVersionModule = CoreSpringFactory.getImpl(VFSVersionModule.class);
 		}
+		if (docEditorService == null) {
+			docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class);
+		}
 		
 		LicenseModule licenseModule = CoreSpringFactory.getImpl(LicenseModule.class);
 		LicenseHandler licenseHandler = CoreSpringFactory.getImpl(FolderLicenseHandler.class);
@@ -508,9 +513,9 @@ public class ListRenderer {
 	private String getOpenIconCss(VFSItem child, boolean canWrite, Identity identity) {
 		if (child instanceof VFSLeaf) {
 			VFSLeaf vfsLeaf = (VFSLeaf) child;
-			if (canWrite && vfsRepositoryService.hasEditor(vfsLeaf, Mode.EDIT, identity)) {
+			if (canWrite && docEditorService.hasEditor(vfsLeaf, Mode.EDIT, identity)) {
 				return "o_icon_edit";
-			} else if (vfsRepositoryService.hasEditor(vfsLeaf, Mode.VIEW, identity)) {
+			} else if (docEditorService.hasEditor(vfsLeaf, Mode.VIEW, identity)) {
 				return "o_icon_preview";
 			}
 		}
diff --git a/src/main/java/org/olat/core/commons/services/_spring/servicesCorecontext.xml b/src/main/java/org/olat/core/commons/services/_spring/servicesCorecontext.xml
index 60ec9aecc3c..ed281a1287f 100644
--- a/src/main/java/org/olat/core/commons/services/_spring/servicesCorecontext.xml
+++ b/src/main/java/org/olat/core/commons/services/_spring/servicesCorecontext.xml
@@ -118,6 +118,25 @@
 		</property>
 	</bean>
 	
+	<!-- Collabora admin. panel -->
+	<bean class="org.olat.core.extensions.action.GenericActionExtension" init-method="initExtensionPoints">
+		<property name="order" value="8256" />
+		<property name="actionController">	
+			<bean class="org.olat.core.gui.control.creator.AutoCreator" scope="prototype">
+				<property name="className" value="org.olat.core.commons.services.doceditor.collabora.ui.CollaboraAdminController"/>
+			</bean>
+		</property>
+		<property name="navigationKey" value="collabora" />
+		<property name="i18nActionKey" value="admin.menu.title"/>
+		<property name="i18nDescriptionKey" value="admin.menu.title.alt"/>
+		<property name="translationPackage" value="org.olat.core.commons.services.doceditor.collabora.ui"/>
+		<property name="parentTreeNodeIdentifier" value="externalToolsParent" /> 
+		<property name="extensionPoints">
+			<list>	
+				<value>org.olat.admin.SystemAdminMainController</value>		
+			</list>
+		</property>
+	</bean>
 	
 	<!-- Cleaning job for CSP reports -->
 	<bean id="cspCleanupJob" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
diff --git a/src/main/java/org/olat/core/commons/services/filetemplate/ContentProvider.java b/src/main/java/org/olat/core/commons/services/doceditor/ContentProvider.java
similarity index 95%
rename from src/main/java/org/olat/core/commons/services/filetemplate/ContentProvider.java
rename to src/main/java/org/olat/core/commons/services/doceditor/ContentProvider.java
index 98ad7ccf3ed..75b720c0a51 100644
--- a/src/main/java/org/olat/core/commons/services/filetemplate/ContentProvider.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ContentProvider.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.core.commons.services.filetemplate;
+package org.olat.core.commons.services.doceditor;
 
 import java.io.InputStream;
 
diff --git a/src/main/java/org/olat/core/commons/services/filetemplate/ContentProviderFactory.java b/src/main/java/org/olat/core/commons/services/doceditor/ContentProviderFactory.java
similarity index 98%
rename from src/main/java/org/olat/core/commons/services/filetemplate/ContentProviderFactory.java
rename to src/main/java/org/olat/core/commons/services/doceditor/ContentProviderFactory.java
index f1aacdba2c9..5439478bd8f 100644
--- a/src/main/java/org/olat/core/commons/services/filetemplate/ContentProviderFactory.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ContentProviderFactory.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.core.commons.services.filetemplate;
+package org.olat.core.commons.services.doceditor;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
diff --git a/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditor.java b/src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java
similarity index 92%
rename from src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditor.java
rename to src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java
index 0f8ed28d40e..3720ab016f3 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditor.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.core.commons.services.vfs;
+package org.olat.core.commons.services.doceditor;
 
 import java.util.Locale;
 
@@ -33,7 +33,7 @@ import org.olat.core.util.vfs.VFSLeaf;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public interface VFSLeafEditor {
+public interface DocEditor {
 	
 	public enum Mode {EDIT, VIEW};
 	
@@ -63,7 +63,7 @@ public interface VFSLeafEditor {
 	boolean isLockedForMe(VFSLeaf vfsLeaf, Mode mode, Identity identity);
 	
 	Controller getRunController(UserRequest ureq, WindowControl wControl, Identity identity, VFSLeaf vfsLeaf,
-			VFSLeafEditorSecurityCallback securityCallback, VFSLeafEditorConfigs configs);
+			DocEditorSecurityCallback securityCallback, DocEditorConfigs configs);
 
 
 }
diff --git a/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorConfigs.java b/src/main/java/org/olat/core/commons/services/doceditor/DocEditorConfigs.java
similarity index 81%
rename from src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorConfigs.java
rename to src/main/java/org/olat/core/commons/services/doceditor/DocEditorConfigs.java
index 99402ac35bb..15bcce94099 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorConfigs.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/DocEditorConfigs.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.core.commons.services.vfs;
+package org.olat.core.commons.services.doceditor;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -28,17 +28,17 @@ import java.util.Map;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class VFSLeafEditorConfigs {
+public class DocEditorConfigs {
 	
 	public static interface Config {
 		public String getType();
 	}
 	
-	private static final VFSLeafEditorConfigs NONE = VFSLeafEditorConfigs.builder().build();
+	private static final DocEditorConfigs NONE = DocEditorConfigs.builder().build();
 	
 	private Map<String, Config> configs;
 
-	private VFSLeafEditorConfigs(Builder builder) {
+	private DocEditorConfigs(Builder builder) {
 		this.configs = new HashMap<>(builder.configs);
 	}
 	
@@ -46,7 +46,7 @@ public class VFSLeafEditorConfigs {
 		return this.configs.get(type);
 	}
 	
-	public static VFSLeafEditorConfigs none() {
+	public static DocEditorConfigs none() {
 		return NONE;
 	}
 
@@ -65,8 +65,8 @@ public class VFSLeafEditorConfigs {
 			return this;
 		}
 
-		public VFSLeafEditorConfigs build() {
-			return new VFSLeafEditorConfigs(this);
+		public DocEditorConfigs build() {
+			return new DocEditorConfigs(this);
 		}
 	}
 	
diff --git a/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorSecurityCallback.java b/src/main/java/org/olat/core/commons/services/doceditor/DocEditorSecurityCallback.java
similarity index 86%
rename from src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorSecurityCallback.java
rename to src/main/java/org/olat/core/commons/services/doceditor/DocEditorSecurityCallback.java
index 07afb865274..b100e62146d 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorSecurityCallback.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/DocEditorSecurityCallback.java
@@ -17,9 +17,9 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.core.commons.services.vfs;
+package org.olat.core.commons.services.doceditor;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
 
 /**
  * 
@@ -27,7 +27,7 @@ import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public interface VFSLeafEditorSecurityCallback {
+public interface DocEditorSecurityCallback {
 	
 	Mode getMode();
 	
diff --git a/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorSecurityCallbackBuilder.java b/src/main/java/org/olat/core/commons/services/doceditor/DocEditorSecurityCallbackBuilder.java
similarity index 76%
rename from src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorSecurityCallbackBuilder.java
rename to src/main/java/org/olat/core/commons/services/doceditor/DocEditorSecurityCallbackBuilder.java
index 1c1bad29867..a82c7db4013 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorSecurityCallbackBuilder.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/DocEditorSecurityCallbackBuilder.java
@@ -17,9 +17,9 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.core.commons.services.vfs;
+package org.olat.core.commons.services.doceditor;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
 
 /**
  * 
@@ -27,7 +27,7 @@ import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class VFSLeafEditorSecurityCallbackBuilder {
+public class DocEditorSecurityCallbackBuilder {
 	
 	private Mode mode = Mode.VIEW;
 	private boolean versionControlled = false;
@@ -39,7 +39,7 @@ public class VFSLeafEditorSecurityCallbackBuilder {
 	 * @param mode
 	 * @return
 	 */
-	public VFSLeafEditorSecurityCallbackBuilder withMode(Mode mode) {
+	public DocEditorSecurityCallbackBuilder withMode(Mode mode) {
 		this.mode = mode;
 		return this;
 	}
@@ -50,7 +50,7 @@ public class VFSLeafEditorSecurityCallbackBuilder {
 	 * @param versionControlled
 	 * @return
 	 */
-	public VFSLeafEditorSecurityCallbackBuilder withVersionControlled(boolean versionControlled) {
+	public DocEditorSecurityCallbackBuilder withVersionControlled(boolean versionControlled) {
 		this.versionControlled = versionControlled;
 		return this;
 	}
@@ -61,12 +61,12 @@ public class VFSLeafEditorSecurityCallbackBuilder {
 	 * @param canClose
 	 * @return
 	 */
-	public VFSLeafEditorSecurityCallbackBuilder canClose(boolean canClose) {
+	public DocEditorSecurityCallbackBuilder canClose(boolean canClose) {
 		this.canClose = canClose;
 		return this;
 	}
 	
-	public VFSLeafEditorSecurityCallback build() {
+	public DocEditorSecurityCallback build() {
 		VFSLeafEditorSecurityCallbackImpl secCallback = new VFSLeafEditorSecurityCallbackImpl();
 		secCallback.setMode(this.mode);
 		secCallback.setVersionControlled(this.versionControlled);
@@ -74,21 +74,21 @@ public class VFSLeafEditorSecurityCallbackBuilder {
 		return secCallback;
 	}
 	
-	public static VFSLeafEditorSecurityCallbackBuilder builder() {
-		return new VFSLeafEditorSecurityCallbackBuilder();
+	public static DocEditorSecurityCallbackBuilder builder() {
+		return new DocEditorSecurityCallbackBuilder();
 	}
 	
-	public static VFSLeafEditorSecurityCallbackBuilder clone(VFSLeafEditorSecurityCallback secCallback) {
+	public static DocEditorSecurityCallbackBuilder clone(DocEditorSecurityCallback secCallback) {
 		return builder()
 				.withMode(secCallback.getMode())
 				.withVersionControlled(secCallback.isVersionControlled())
 				.canClose(secCallback.canClose());
 	}
 	
-	private VFSLeafEditorSecurityCallbackBuilder() {
+	private DocEditorSecurityCallbackBuilder() {
 	}
 	
-	private static class VFSLeafEditorSecurityCallbackImpl implements VFSLeafEditorSecurityCallback {
+	private static class VFSLeafEditorSecurityCallbackImpl implements DocEditorSecurityCallback {
 
 		private Mode mode;
 		private boolean versionControlled;
diff --git a/src/main/java/org/olat/core/commons/services/filetemplate/FileType.java b/src/main/java/org/olat/core/commons/services/doceditor/DocTemplate.java
similarity index 80%
rename from src/main/java/org/olat/core/commons/services/filetemplate/FileType.java
rename to src/main/java/org/olat/core/commons/services/doceditor/DocTemplate.java
index e0e055e5683..0f15108c1da 100644
--- a/src/main/java/org/olat/core/commons/services/filetemplate/FileType.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/DocTemplate.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.core.commons.services.filetemplate;
+package org.olat.core.commons.services.doceditor;
 
 /**
  * 
@@ -25,17 +25,17 @@ package org.olat.core.commons.services.filetemplate;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class FileType {
+public class DocTemplate {
 	
 	private final String suffix;
 	private final String name;
 	private final ContentProvider contentProvider;
 	
-	public static FileType of(String suffix, String name, ContentProvider contentProvider) {
-		return new FileType(suffix, name, contentProvider);
+	public static DocTemplate of(String suffix, String name, ContentProvider contentProvider) {
+		return new DocTemplate(suffix, name, contentProvider);
 	}
 	
-	private FileType(String suffix, String name, ContentProvider contentProvider) {
+	private DocTemplate(String suffix, String name, ContentProvider contentProvider) {
 		this.suffix = suffix;
 		this.name = name;
 		this.contentProvider = contentProvider;
diff --git a/src/main/java/org/olat/core/commons/services/filetemplate/FileTypes.java b/src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java
similarity index 50%
rename from src/main/java/org/olat/core/commons/services/filetemplate/FileTypes.java
rename to src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java
index 66c564b2125..b03bbc79e51 100644
--- a/src/main/java/org/olat/core/commons/services/filetemplate/FileTypes.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java
@@ -17,21 +17,20 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.core.commons.services.filetemplate;
+package org.olat.core.commons.services.doceditor;
 
-import static org.olat.core.commons.services.filetemplate.ContentProviderFactory.empty;
-import static org.olat.core.commons.services.filetemplate.ContentProviderFactory.emptyDocx;
-import static org.olat.core.commons.services.filetemplate.ContentProviderFactory.emptyPptx;
-import static org.olat.core.commons.services.filetemplate.ContentProviderFactory.emptyXlsx;
-import static org.olat.core.commons.services.vfs.VFSLeafEditor.Mode.EDIT;
+import static org.olat.core.commons.services.doceditor.ContentProviderFactory.empty;
+import static org.olat.core.commons.services.doceditor.ContentProviderFactory.emptyDocx;
+import static org.olat.core.commons.services.doceditor.ContentProviderFactory.emptyPptx;
+import static org.olat.core.commons.services.doceditor.ContentProviderFactory.emptyXlsx;
+import static org.olat.core.commons.services.doceditor.DocEditor.Mode.EDIT;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 
 import org.olat.core.CoreSpringFactory;
-import org.olat.core.commons.services.filetemplate.ui.CreateFileController;
-import org.olat.core.commons.services.vfs.VFSRepositoryService;
+import org.olat.core.commons.services.doceditor.ui.CreateDocumentController;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.util.Util;
 
@@ -41,43 +40,43 @@ import org.olat.core.util.Util;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class FileTypes {
+public class DocTemplates {
 	
-	private final List<FileType> fileTypes;
+	private final List<DocTemplate> docTemplates;
 
-	private FileTypes(List<FileType> fileTypes) {
-		this.fileTypes = fileTypes;
+	private DocTemplates(List<DocTemplate> docTemplates) {
+		this.docTemplates = docTemplates;
 	}
 	
-	public List<FileType> getFileTypes() {
-		return fileTypes;
+	public List<DocTemplate> getTemplates() {
+		return docTemplates;
 	}
 
 	public boolean isEmpty() {
-		return fileTypes.isEmpty();
+		return docTemplates.isEmpty();
 	}
 	
 	public static Builder editables(Locale locale) {
 		Builder builder = new Builder(locale);
 		
-		VFSRepositoryService vfsService = CoreSpringFactory.getImpl(VFSRepositoryService.class);
+		DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class);
 		
-		if (vfsService.hasEditor("txt", EDIT)) {
+		if (docEditorService.hasEditor("txt", EDIT)) {
 			builder.addTxt();
 		}
-		if (vfsService.hasEditor("html", EDIT)) {
+		if (docEditorService.hasEditor("html", EDIT)) {
 			builder.addHtml();
 		}
-		if (vfsService.hasEditor("css", EDIT)) {
+		if (docEditorService.hasEditor("css", EDIT)) {
 			builder.addCss();
 		}
-		if (vfsService.hasEditor("docx", EDIT)) {
+		if (docEditorService.hasEditor("docx", EDIT)) {
 			builder.addDocx();
 		}
-		if (vfsService.hasEditor("xlsx", EDIT)) {
+		if (docEditorService.hasEditor("xlsx", EDIT)) {
 			builder.addXlsx();
 		}
-		if (vfsService.hasEditor("pptx", EDIT)) {
+		if (docEditorService.hasEditor("pptx", EDIT)) {
 			builder.addPptx();
 		}
 			
@@ -90,44 +89,44 @@ public class FileTypes {
 
 	public static final class Builder {
 		private final Translator translator;
-		private List<FileType> fileTypes = new ArrayList<>();
+		private List<DocTemplate> docTemplates = new ArrayList<>();
 
 		private Builder(Locale locale) {
-			this.translator = Util.createPackageTranslator(CreateFileController.class, locale);
+			this.translator = Util.createPackageTranslator(CreateDocumentController.class, locale);
 		}
 		
 		public Builder addCss() {
-			fileTypes.add(FileType.of("css", translate("file.type.css"), empty()));
+			docTemplates.add(DocTemplate.of("css", translate("doc.type.css"), empty()));
 			return this;
 		}
 		
 		public Builder addDocx() {
-			fileTypes.add(FileType.of("docx", translate("file.type.docx"), emptyDocx()));
+			docTemplates.add(DocTemplate.of("docx", translate("doc.type.docx"), emptyDocx()));
 			return this;
 		}
 		
 		public Builder addHtml() {
-			fileTypes.add(FileType.of("html", translate("file.type.html"), empty()));
+			docTemplates.add(DocTemplate.of("html", translate("doc.type.html"), empty()));
 			return this;
 		}
 		
 		public Builder addTxt() {
-			fileTypes.add(FileType.of("txt", translate("file.type.txt"), empty()));
+			docTemplates.add(DocTemplate.of("txt", translate("doc.type.txt"), empty()));
 			return this;
 		}
 		
 		public Builder addXlsx() {
-			fileTypes.add(FileType.of("xlsx", translate("file.type.xlsx"), emptyXlsx()));
+			docTemplates.add(DocTemplate.of("xlsx", translate("doc.type.xlsx"), emptyXlsx()));
 			return this;
 		}
 		
 		public Builder addPptx() {
-			fileTypes.add(FileType.of("pptx", translate("file.type.pptx"), emptyPptx()));
+			docTemplates.add(DocTemplate.of("pptx", translate("doc.type.pptx"), emptyPptx()));
 			return this;
 		}
 
-		public Builder addFileType(FileType fileType) {
-			this.fileTypes.add(fileType);
+		public Builder addFileType(DocTemplate docTemplate) {
+			this.docTemplates.add(docTemplate);
 			return this;
 		}
 
@@ -135,8 +134,8 @@ public class FileTypes {
 			return translator.translate(i18nKey);
 		}
 
-		public FileTypes build() {
-			return new FileTypes(new ArrayList<>(fileTypes));
+		public DocTemplates build() {
+			return new DocTemplates(new ArrayList<>(docTemplates));
 		}
 	}
 	
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java b/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java
new file mode 100644
index 00000000000..0b79e2d75fa
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java
@@ -0,0 +1,75 @@
+/**
+ * <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.core.commons.services.doceditor;
+
+import java.util.List;
+import java.util.Optional;
+
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.id.Identity;
+import org.olat.core.util.vfs.VFSLeaf;
+
+/**
+ * 
+ * Initial date: 8 Apr 2019<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public interface DocumentEditorService {
+	
+	/**
+	 * Check if file with a specific suffix is supported by any enabled editor.
+	 *
+	 * @param suffix
+	 * @param mode
+	 * @return
+	 */
+	public boolean hasEditor(String suffix, Mode mode);
+	
+	/**
+	 * Get all enabled editors which support a file with a specific suffix. Support means usually edit or read.
+	 *
+	 * @param suffix
+	 * @param mode
+	 * @return
+	 */
+	public List<DocEditor> getEditors(String suffix, Mode mode);
+	
+	/**
+	 * Get the editor of a specific type.
+	 * 
+	 * @param editorType
+	 * @return
+	 */
+	public Optional<DocEditor> getEditor(String editorType);
+	
+	/**
+	 * Checks whether a vfsLeaf can be opened in any editor by a user and in a
+	 * specific mode. This method checks not only if a file format is supported but
+	 * also if the vfsLeaf is not locked by an other editor or user.
+	 *
+	 * @param vfsLeaf
+	 * @param mode
+	 * @param identity
+	 * @return
+	 */
+	public boolean hasEditor(VFSLeaf vfsLeaf, Mode mode, Identity identity);
+	
+}
diff --git a/src/main/java/org/olat/modules/wopi/collabora/CollaboraEditor.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java
similarity index 83%
rename from src/main/java/org/olat/modules/wopi/collabora/CollaboraEditor.java
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java
index ca61c7d560f..ee71e6b32a8 100644
--- a/src/main/java/org/olat/modules/wopi/collabora/CollaboraEditor.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java
@@ -17,13 +17,14 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.collabora;
+package org.olat.core.commons.services.doceditor.collabora;
 
 import java.util.Locale;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor;
-import org.olat.core.commons.services.vfs.VFSLeafEditorConfigs;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditor;
+import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.collabora.ui.CollaboraEditorController;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
@@ -31,7 +32,6 @@ import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
 import org.olat.core.util.Util;
 import org.olat.core.util.vfs.VFSLeaf;
-import org.olat.modules.wopi.collabora.ui.CollaboraEditorController;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -42,7 +42,7 @@ import org.springframework.stereotype.Service;
  *
  */
 @Service
-public class CollaboraEditor implements VFSLeafEditor {
+public class CollaboraEditor implements DocEditor {
 
 	@Autowired
 	private CollaboraModule collaboraModule;
@@ -80,7 +80,7 @@ public class CollaboraEditor implements VFSLeafEditor {
 
 	@Override
 	public Controller getRunController(UserRequest ureq, WindowControl wControl, Identity identity, VFSLeaf vfsLeaf,
-			VFSLeafEditorSecurityCallback securityCallback, VFSLeafEditorConfigs configs) {
+			DocEditorSecurityCallback securityCallback, DocEditorConfigs configs) {
 		return new CollaboraEditorController(ureq, wControl, vfsLeaf, securityCallback);
 	}
 
diff --git a/src/main/java/org/olat/modules/wopi/collabora/CollaboraModule.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraModule.java
similarity index 97%
rename from src/main/java/org/olat/modules/wopi/collabora/CollaboraModule.java
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraModule.java
index f70ebc16393..95f295f410c 100644
--- a/src/main/java/org/olat/modules/wopi/collabora/CollaboraModule.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraModule.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.collabora;
+package org.olat.core.commons.services.doceditor.collabora;
 
 import org.olat.core.configuration.AbstractSpringModule;
 import org.olat.core.configuration.ConfigOnOff;
diff --git a/src/main/java/org/olat/modules/wopi/collabora/CollaboraRefreshDiscoveryEvent.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraRefreshDiscoveryEvent.java
similarity index 95%
rename from src/main/java/org/olat/modules/wopi/collabora/CollaboraRefreshDiscoveryEvent.java
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraRefreshDiscoveryEvent.java
index 62c9738f451..b2e11756330 100644
--- a/src/main/java/org/olat/modules/wopi/collabora/CollaboraRefreshDiscoveryEvent.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraRefreshDiscoveryEvent.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.collabora;
+package org.olat.core.commons.services.doceditor.collabora;
 
 import org.olat.core.util.event.MultiUserEvent;
 
diff --git a/src/main/java/org/olat/modules/wopi/collabora/CollaboraService.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraService.java
similarity index 85%
rename from src/main/java/org/olat/modules/wopi/collabora/CollaboraService.java
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraService.java
index 8ed1b8c022b..c07d350cf39 100644
--- a/src/main/java/org/olat/modules/wopi/collabora/CollaboraService.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraService.java
@@ -17,21 +17,21 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.collabora;
+package org.olat.core.commons.services.doceditor.collabora;
 
 import java.io.File;
 import java.io.InputStream;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.commons.services.doceditor.wopi.Access;
+import org.olat.core.commons.services.doceditor.wopi.Discovery;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.lock.LockResult;
-import org.olat.modules.wopi.Access;
-import org.olat.modules.wopi.Discovery;
 
 /**
  * 
@@ -50,7 +50,7 @@ public interface CollaboraService {
 
 	VFSMetadata getMetadata(String fileId);
 	
-	Access createAccess(VFSMetadata vfsMetadata, Identity identity, VFSLeafEditorSecurityCallback secCallback);
+	Access createAccess(VFSMetadata vfsMetadata, Identity identity, DocEditorSecurityCallback secCallback);
 
 	Access getAccess(String accessToken);
 	
diff --git a/src/main/java/org/olat/modules/wopi/collabora/manager/CollaboraServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/manager/CollaboraServiceImpl.java
similarity index 88%
rename from src/main/java/org/olat/modules/wopi/collabora/manager/CollaboraServiceImpl.java
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/manager/CollaboraServiceImpl.java
index bc3aaeda382..8bfa862b04e 100644
--- a/src/main/java/org/olat/modules/wopi/collabora/manager/CollaboraServiceImpl.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/manager/CollaboraServiceImpl.java
@@ -17,15 +17,23 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.collabora.manager;
+package org.olat.core.commons.services.doceditor.collabora.manager;
 
 import java.io.File;
 import java.io.InputStream;
 
 import javax.annotation.PostConstruct;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.commons.services.doceditor.collabora.CollaboraModule;
+import org.olat.core.commons.services.doceditor.collabora.CollaboraRefreshDiscoveryEvent;
+import org.olat.core.commons.services.doceditor.collabora.CollaboraService;
+import org.olat.core.commons.services.doceditor.wopi.Access;
+import org.olat.core.commons.services.doceditor.wopi.Action;
+import org.olat.core.commons.services.doceditor.wopi.Discovery;
+import org.olat.core.commons.services.doceditor.wopi.WopiDiscoveryClient;
+import org.olat.core.commons.services.doceditor.wopi.WopiService;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.commons.services.vfs.VFSRepositoryService;
 import org.olat.core.gui.control.Event;
@@ -42,14 +50,6 @@ import org.olat.core.util.vfs.VFSLockManager;
 import org.olat.core.util.vfs.VFSManager;
 import org.olat.core.util.vfs.lock.LockInfo;
 import org.olat.core.util.vfs.lock.LockResult;
-import org.olat.modules.wopi.Access;
-import org.olat.modules.wopi.Action;
-import org.olat.modules.wopi.Discovery;
-import org.olat.modules.wopi.WopiDiscoveryClient;
-import org.olat.modules.wopi.WopiService;
-import org.olat.modules.wopi.collabora.CollaboraModule;
-import org.olat.modules.wopi.collabora.CollaboraRefreshDiscoveryEvent;
-import org.olat.modules.wopi.collabora.CollaboraService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -98,7 +98,7 @@ public class CollaboraServiceImpl implements CollaboraService, GenericEventListe
 	}
 
 	@Override
-	public Access createAccess(VFSMetadata vfsMetadata, Identity identity, VFSLeafEditorSecurityCallback secCallback) {
+	public Access createAccess(VFSMetadata vfsMetadata, Identity identity, DocEditorSecurityCallback secCallback) {
 		return wopiService.createAccess(vfsMetadata, identity, secCallback);
 	}
 
diff --git a/src/main/java/org/olat/modules/wopi/collabora/restapi/CheckFileInfoVO.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/restapi/CheckFileInfoVO.java
similarity index 99%
rename from src/main/java/org/olat/modules/wopi/collabora/restapi/CheckFileInfoVO.java
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/restapi/CheckFileInfoVO.java
index accc9647c2e..328ace5429c 100644
--- a/src/main/java/org/olat/modules/wopi/collabora/restapi/CheckFileInfoVO.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/restapi/CheckFileInfoVO.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.collabora.restapi;
+package org.olat.core.commons.services.doceditor.collabora.restapi;
 
 import javax.annotation.Generated;
 
diff --git a/src/main/java/org/olat/modules/wopi/collabora/restapi/FilesWebService.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/restapi/FilesWebService.java
similarity index 94%
rename from src/main/java/org/olat/modules/wopi/collabora/restapi/FilesWebService.java
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/restapi/FilesWebService.java
index 7eac1742f8e..5c9d6938d7d 100644
--- a/src/main/java/org/olat/modules/wopi/collabora/restapi/FilesWebService.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/restapi/FilesWebService.java
@@ -17,10 +17,10 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.collabora.restapi;
+package org.olat.core.commons.services.doceditor.collabora.restapi;
 
-import static org.olat.modules.wopi.WopiRestHelper.getAsIso6801;
-import static org.olat.modules.wopi.WopiRestHelper.getFirstRequestHeader;
+import static org.olat.core.commons.services.doceditor.wopi.WopiRestHelper.getAsIso6801;
+import static org.olat.core.commons.services.doceditor.wopi.WopiRestHelper.getFirstRequestHeader;
 
 import java.io.File;
 import java.io.InputStream;
@@ -42,12 +42,12 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
+import org.olat.core.commons.services.doceditor.collabora.CollaboraModule;
+import org.olat.core.commons.services.doceditor.collabora.CollaboraService;
+import org.olat.core.commons.services.doceditor.wopi.Access;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
-import org.olat.modules.wopi.Access;
-import org.olat.modules.wopi.collabora.CollaboraModule;
-import org.olat.modules.wopi.collabora.CollaboraService;
 import org.olat.user.UserManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
diff --git a/src/main/java/org/olat/modules/wopi/collabora/restapi/PutFileVO.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/restapi/PutFileVO.java
similarity index 96%
rename from src/main/java/org/olat/modules/wopi/collabora/restapi/PutFileVO.java
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/restapi/PutFileVO.java
index 464942cb37a..19effea8980 100644
--- a/src/main/java/org/olat/modules/wopi/collabora/restapi/PutFileVO.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/restapi/PutFileVO.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.collabora.restapi;
+package org.olat.core.commons.services.doceditor.collabora.restapi;
 
 import javax.annotation.Generated;
 
diff --git a/src/main/java/org/olat/modules/wopi/collabora/ui/CollaboraAdminController.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraAdminController.java
similarity index 89%
rename from src/main/java/org/olat/modules/wopi/collabora/ui/CollaboraAdminController.java
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraAdminController.java
index e384f8fc0a2..e1b9cd3d9e5 100644
--- a/src/main/java/org/olat/modules/wopi/collabora/ui/CollaboraAdminController.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraAdminController.java
@@ -17,12 +17,16 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.collabora.ui;
+package org.olat.core.commons.services.doceditor.collabora.ui;
 
+import static org.olat.core.commons.services.doceditor.collabora.CollaboraService.REFRESH_EVENT_ORES;
+import static org.olat.core.commons.services.doceditor.collabora.ui.CollaboraUIFactory.validateIsMandatory;
 import static org.olat.core.gui.translator.TranslatorHelper.translateAll;
-import static org.olat.modules.wopi.collabora.CollaboraService.REFRESH_EVENT_ORES;
-import static org.olat.modules.wopi.collabora.ui.CollaboraUIFactory.validateIsMandatory;
 
+import org.olat.core.commons.services.doceditor.collabora.CollaboraModule;
+import org.olat.core.commons.services.doceditor.collabora.CollaboraRefreshDiscoveryEvent;
+import org.olat.core.commons.services.doceditor.collabora.CollaboraService;
+import org.olat.core.commons.services.doceditor.wopi.Discovery;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
@@ -39,10 +43,6 @@ import org.olat.core.helpers.Settings;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.coordinate.CoordinatorManager;
-import org.olat.modules.wopi.Discovery;
-import org.olat.modules.wopi.collabora.CollaboraModule;
-import org.olat.modules.wopi.collabora.CollaboraRefreshDiscoveryEvent;
-import org.olat.modules.wopi.collabora.CollaboraService;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
diff --git a/src/main/java/org/olat/modules/wopi/collabora/ui/CollaboraEditorController.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraEditorController.java
similarity index 83%
rename from src/main/java/org/olat/modules/wopi/collabora/ui/CollaboraEditorController.java
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraEditorController.java
index 2d88c87ee99..f46bbe79da8 100644
--- a/src/main/java/org/olat/modules/wopi/collabora/ui/CollaboraEditorController.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraEditorController.java
@@ -17,11 +17,13 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.collabora.ui;
+package org.olat.core.commons.services.doceditor.collabora.ui;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallbackBuilder;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallbackBuilder;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.commons.services.doceditor.collabora.CollaboraService;
+import org.olat.core.commons.services.doceditor.wopi.Access;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.velocity.VelocityContainer;
@@ -31,8 +33,6 @@ import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.util.CodeHelper;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.lock.LockResult;
-import org.olat.modules.wopi.Access;
-import org.olat.modules.wopi.collabora.CollaboraService;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
@@ -44,7 +44,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 public class CollaboraEditorController extends BasicController {
 	
 	private final VFSLeaf vfsLeaf;
-	private VFSLeafEditorSecurityCallback secCallback;
+	private DocEditorSecurityCallback secCallback;
 	private LockResult lock;
 	private Access access;
 
@@ -52,14 +52,14 @@ public class CollaboraEditorController extends BasicController {
 	private CollaboraService collaboraService;
 
 	public CollaboraEditorController(UserRequest ureq, WindowControl wControl, VFSLeaf vfsLeaf,
-			final VFSLeafEditorSecurityCallback securityCallback) {
+			final DocEditorSecurityCallback securityCallback) {
 		super(ureq, wControl);
 		this.vfsLeaf = vfsLeaf;
 		this.secCallback = securityCallback;
 	
 		if (collaboraService.isLockNeeded(securityCallback.getMode())) {
 			if (collaboraService.isLockedForMe(vfsLeaf, getIdentity())) {
-				this.secCallback = VFSLeafEditorSecurityCallbackBuilder.clone(securityCallback)
+				this.secCallback = DocEditorSecurityCallbackBuilder.clone(securityCallback)
 						.withMode(Mode.VIEW)
 						.build();
 				showWarning("editor.warning.locked");
diff --git a/src/main/java/org/olat/modules/wopi/collabora/ui/CollaboraEditorUrlBuilder.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraEditorUrlBuilder.java
similarity index 95%
rename from src/main/java/org/olat/modules/wopi/collabora/ui/CollaboraEditorUrlBuilder.java
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraEditorUrlBuilder.java
index bd11a6a45ee..3297c650567 100644
--- a/src/main/java/org/olat/modules/wopi/collabora/ui/CollaboraEditorUrlBuilder.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraEditorUrlBuilder.java
@@ -17,14 +17,14 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.collabora.ui;
+package org.olat.core.commons.services.doceditor.collabora.ui;
 
 import java.io.File;
 
 import org.olat.core.CoreSpringFactory;
+import org.olat.core.commons.services.doceditor.collabora.CollaboraService;
 import org.olat.core.helpers.Settings;
 import org.olat.core.util.StringHelper;
-import org.olat.modules.wopi.collabora.CollaboraService;
 import org.olat.restapi.security.RestSecurityHelper;
 import org.springframework.beans.factory.annotation.Autowired;
 
diff --git a/src/main/java/org/olat/modules/wopi/collabora/ui/CollaboraUIFactory.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraUIFactory.java
similarity index 95%
rename from src/main/java/org/olat/modules/wopi/collabora/ui/CollaboraUIFactory.java
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraUIFactory.java
index 3bc586b35e7..a115a2cdfa5 100644
--- a/src/main/java/org/olat/modules/wopi/collabora/ui/CollaboraUIFactory.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraUIFactory.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.collabora.ui;
+package org.olat.core.commons.services.doceditor.collabora.ui;
 
 import org.olat.core.gui.components.form.flexible.elements.TextElement;
 import org.olat.core.util.StringHelper;
diff --git a/src/main/java/org/olat/modules/wopi/collabora/ui/_content/collabora.html b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_content/collabora.html
similarity index 100%
rename from src/main/java/org/olat/modules/wopi/collabora/ui/_content/collabora.html
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_content/collabora.html
diff --git a/src/main/java/org/olat/modules/wopi/collabora/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_i18n/LocalStrings_de.properties
similarity index 100%
rename from src/main/java/org/olat/modules/wopi/collabora/ui/_i18n/LocalStrings_de.properties
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_i18n/LocalStrings_de.properties
diff --git a/src/main/java/org/olat/modules/wopi/collabora/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_i18n/LocalStrings_en.properties
similarity index 100%
rename from src/main/java/org/olat/modules/wopi/collabora/ui/_i18n/LocalStrings_en.properties
rename to src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/_i18n/LocalStrings_en.properties
diff --git a/src/main/java/org/olat/core/commons/services/filetemplate/empty.pptx b/src/main/java/org/olat/core/commons/services/doceditor/empty.pptx
similarity index 100%
rename from src/main/java/org/olat/core/commons/services/filetemplate/empty.pptx
rename to src/main/java/org/olat/core/commons/services/doceditor/empty.pptx
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java
new file mode 100644
index 00000000000..e94be29f558
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java
@@ -0,0 +1,88 @@
+/**
+ * <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.core.commons.services.doceditor.manager;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import org.olat.core.commons.services.doceditor.DocEditor;
+import org.olat.core.commons.services.doceditor.DocumentEditorService;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.id.Identity;
+import org.olat.core.util.FileUtils;
+import org.olat.core.util.vfs.VFSLeaf;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 
+ * Initial date: 8 Apr 2019<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+@Service
+public class DocumentEditorServiceImpl implements DocumentEditorService {
+
+	@Autowired
+	private List<DocEditor> editors;
+	
+	@Override
+	public boolean hasEditor(String suffix, Mode mode) {
+		if (mode == null) return false;
+		
+		return editors.stream()
+				.filter(DocEditor::isEnable)
+				.filter(editor -> editor.isSupportingFormat(suffix, mode))
+				.findFirst()
+				.isPresent();
+	}
+
+	@Override
+	public List<DocEditor> getEditors(String suffix, Mode mode) {
+		return editors.stream()
+				.filter(DocEditor::isEnable)
+				.filter(editor -> editor.isSupportingFormat(suffix, mode))
+				.collect(Collectors.toList());
+	}
+
+	@Override
+	public Optional<DocEditor> getEditor(String editorType) {
+		return editors.stream()
+				.filter(DocEditor::isEnable)
+				.filter(editor -> editor.getType().equals(editorType))
+				.findFirst();
+	}
+	
+	@Override
+	public boolean hasEditor(VFSLeaf vfsLeaf, Mode mode, Identity identity) {
+		if (mode == null) return false;
+		
+		String suffix = FileUtils.getFileSuffix(vfsLeaf.getName());
+		return editors.stream()
+				.filter(DocEditor::isEnable)
+				.filter(editor -> editor.isSupportingFormat(suffix, mode))
+				.filter(editor -> !editor.isLockedForMe(vfsLeaf, mode, identity))
+				.findFirst()
+				.isPresent();
+		
+	}
+
+}
diff --git a/src/main/java/org/olat/core/commons/services/filetemplate/ui/CreateFileController.java b/src/main/java/org/olat/core/commons/services/doceditor/ui/CreateDocumentController.java
similarity index 59%
rename from src/main/java/org/olat/core/commons/services/filetemplate/ui/CreateFileController.java
rename to src/main/java/org/olat/core/commons/services/doceditor/ui/CreateDocumentController.java
index 12ee6bec201..312f9fcf70a 100644
--- a/src/main/java/org/olat/core/commons/services/filetemplate/ui/CreateFileController.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/CreateDocumentController.java
@@ -3,7 +3,7 @@
  * 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 not use this doc 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>
@@ -17,15 +17,15 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.core.commons.services.filetemplate.ui;
+package org.olat.core.commons.services.doceditor.ui;
 
 import static org.olat.core.gui.components.util.KeyValues.entry;
 
 import java.util.List;
 
 import org.olat.core.commons.modules.bc.meta.MetaInfoFormController;
-import org.olat.core.commons.services.filetemplate.FileType;
-import org.olat.core.commons.services.filetemplate.FileTypes;
+import org.olat.core.commons.services.doceditor.DocTemplate;
+import org.olat.core.commons.services.doceditor.DocTemplates;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.commons.services.vfs.VFSRepositoryService;
 import org.olat.core.gui.UserRequest;
@@ -52,24 +52,24 @@ import org.springframework.beans.factory.annotation.Autowired;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class CreateFileController extends FormBasicController {
+public class CreateDocumentController extends FormBasicController {
 	
-	private SingleSelection fileTypeEl;
-	private TextElement fileNameEl;
+	private SingleSelection docTypeEl;
+	private TextElement docNameEl;
 	
 	private MetaInfoFormController metadataCtrl;
 
 	private final VFSContainer vfsContainer;
-	private final List<FileType> fileTypes;
+	private final List<DocTemplate> templates;
 	private VFSLeaf vfsLeaf;
 	
 	@Autowired
 	private VFSRepositoryService vfsService;
 	
-	public CreateFileController(UserRequest ureq, WindowControl wControl, VFSContainer vfsContainer, FileTypes fileTypes) {
-		super(ureq, wControl, "create_file");
+	public CreateDocumentController(UserRequest ureq, WindowControl wControl, VFSContainer vfsContainer, DocTemplates templates) {
+		super(ureq, wControl, "create_document");
 		this.vfsContainer = vfsContainer;
-		this.fileTypes = fileTypes.getFileTypes();
+		this.templates = templates.getTemplates();
 		initForm(ureq);
 	}
 	
@@ -79,23 +79,23 @@ public class CreateFileController extends FormBasicController {
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		FormLayoutContainer fileCont = FormLayoutContainer.createDefaultFormLayout("file", getTranslator());
-		formLayout.add(fileCont);
+		FormLayoutContainer docCont = FormLayoutContainer.createDefaultFormLayout("doc", getTranslator());
+		formLayout.add(docCont);
 		
-		KeyValues fileTypeKV = new KeyValues();
-		for (int i = 0; i < fileTypes.size(); i++) {
-			FileType fileType = fileTypes.get(i);
-			String name = fileType.getName() + " (." + fileType.getSuffix() + ")";
-			fileTypeKV.add(entry(String.valueOf(i), name));
+		KeyValues docTypeKV = new KeyValues();
+		for (int i = 0; i < templates.size(); i++) {
+			DocTemplate docTemplate = templates.get(i);
+			String name = docTemplate.getName() + " (." + docTemplate.getSuffix() + ")";
+			docTypeKV.add(entry(String.valueOf(i), name));
 		}
-		fileTypeEl = uifactory.addDropdownSingleselect("create.file.type", fileCont, fileTypeKV.keys(), fileTypeKV.values());
-		fileTypeEl.setElementCssClass("o_sel_folder_new_file_type");
-		fileTypeEl.setMandatory(true);
+		docTypeEl = uifactory.addDropdownSingleselect("create.doc.type", docCont, docTypeKV.keys(), docTypeKV.values());
+		docTypeEl.setElementCssClass("o_sel_folder_new_doc_type");
+		docTypeEl.setMandatory(true);
 		
-		fileNameEl = uifactory.addTextElement("create.file.name", -1, "", fileCont);
-		fileNameEl.setElementCssClass("o_sel_folder_new_file_name");
-		fileNameEl.setDisplaySize(100);
-		fileNameEl.setMandatory(true);
+		docNameEl = uifactory.addTextElement("create.doc.name", -1, "", docCont);
+		docNameEl.setElementCssClass("o_sel_folder_new_doc_name");
+		docNameEl.setDisplaySize(100);
+		docNameEl.setMandatory(true);
 		
 		// metadata
 		metadataCtrl = new MetaInfoFormController(ureq, getWindowControl(), mainForm, false);
@@ -106,7 +106,7 @@ public class CreateFileController extends FormBasicController {
 		formLayout.add(butonsCont);
 		FormLayoutContainer formButtons = FormLayoutContainer.createButtonLayout("formButtons", getTranslator());
 		butonsCont.add(formButtons);
-		uifactory.addFormSubmitButton("submit", "create.file.button", formButtons);
+		uifactory.addFormSubmitButton("submit", "create.doc.button", formButtons);
 		uifactory.addFormCancelButton("cancel", formButtons, ureq, getWindowControl());
 	}
 	
@@ -114,19 +114,19 @@ public class CreateFileController extends FormBasicController {
 	protected boolean validateFormLogic(UserRequest ureq) {
 		boolean allOk = true;
 		
-		String fileName = fileNameEl.getValue();
-		fileNameEl.clearError();
-		if (!StringHelper.containsNonWhitespace(fileName)) {
-			fileNameEl.setErrorKey("form.mandatory.hover", null);
+		String docName = docNameEl.getValue();
+		docNameEl.clearError();
+		if (!StringHelper.containsNonWhitespace(docName)) {
+			docNameEl.setErrorKey("form.mandatory.hover", null);
 			allOk = false;
 		} else {
 			// update in GUI so user sees how we optimized
-			fileNameEl.setValue(fileName);
-			if (invalidFilenName(fileName)) {
-				fileNameEl.setErrorKey("create.file.name.notvalid", null);
+			docNameEl.setValue(docName);
+			if (invalidFilenName(docName)) {
+				docNameEl.setErrorKey("create.doc.name.notvalid", null);
 				allOk = false;
-			} else if (fileExists()){
-				fileNameEl.setErrorKey("create.file.already.exists", new String[] { getFileName() });
+			} else if (docExists()){
+				docNameEl.setErrorKey("create.doc.already.exists", new String[] { getFileName() });
 				allOk = false;
 			}
 		}
@@ -134,26 +134,26 @@ public class CreateFileController extends FormBasicController {
 		return allOk;
 	}
 
-	private boolean invalidFilenName(String fileName) {
-		return !FileUtils.validateFilename(fileName);
+	private boolean invalidFilenName(String docName) {
+		return !FileUtils.validateFilename(docName);
 	}
 	
-	private boolean fileExists() {
+	private boolean docExists() {
 		return vfsContainer.resolve(getFileName()) != null? true: false;
 	}
 	
 	private String getFileName() {
-		String fileName = fileNameEl.getValue();
-		FileType fileType = getSelectedFileType();
-		String suffix = fileType != null? fileType.getSuffix(): "";
-		return fileName.endsWith("." + suffix)
-				? fileName
-				: fileName + "." + suffix;
+		String docName = docNameEl.getValue();
+		DocTemplate docTemplate = getSelectedTemplate();
+		String suffix = docTemplate != null? docTemplate.getSuffix(): "";
+		return docName.endsWith("." + suffix)
+				? docName
+				: docName + "." + suffix;
 	}
 
-	private FileType getSelectedFileType() {
-		int index = fileTypeEl.getSelected();
-		return index > -1? fileTypes.get(index): null;
+	private DocTemplate getSelectedTemplate() {
+		int index = docTypeEl.getSelected();
+		return index > -1? templates.get(index): null;
 	}
 
 	@Override
@@ -163,23 +163,23 @@ public class CreateFileController extends FormBasicController {
 
 	@Override
 	protected void formOK(UserRequest ureq) {
-		String fileName = getFileName();
-		createFile(fileName);
+		String docName = getFileName();
+		createFile(docName);
 		createContent();
 		createMetadata();
 		
 		fireEvent(ureq, Event.DONE_EVENT);
 	}
 
-	private void createFile(String fileName) {
-		vfsLeaf = vfsContainer.createChildLeaf(fileName);
+	private void createFile(String docName) {
+		vfsLeaf = vfsContainer.createChildLeaf(docName);
 	}
 
 	private void createContent() {
 		if (vfsLeaf != null) {
-			FileType fileType = getSelectedFileType();
-			if (fileType != null) {
-				VFSManager.copyContent(fileType.getContentProvider().getContent(), vfsLeaf);
+			DocTemplate docTemplate = getSelectedTemplate();
+			if (docTemplate != null) {
+				VFSManager.copyContent(docTemplate.getContentProvider().getContent(), vfsLeaf);
 			}
 		}
 	}
diff --git a/src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSLeafConfigController.java b/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java
similarity index 72%
rename from src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSLeafConfigController.java
rename to src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java
index 18cfd9edb63..7ba262e4cdf 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSLeafConfigController.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java
@@ -17,14 +17,14 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.core.commons.services.vfs.ui.editor;
+package org.olat.core.commons.services.doceditor.ui;
 
 import java.util.List;
 import java.util.Optional;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
-import org.olat.core.commons.services.vfs.VFSRepositoryService;
+import org.olat.core.commons.services.doceditor.DocEditor;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocumentEditorService;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.dropdown.Dropdown;
@@ -48,7 +48,7 @@ import org.springframework.beans.factory.annotation.Autowired;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class VFSLeafConfigController extends BasicController implements Activateable2 {
+public class DocEditorConfigController extends BasicController implements Activateable2 {
 
 	private static final String GUIPREF_SEPARATOR = "::";
 	private static final String GUIPREF_KEY_EDITOR = "editor";
@@ -57,17 +57,17 @@ public class VFSLeafConfigController extends BasicController implements Activate
 	private Link backButton;
 	
 	private final String guiEditorKey;
-	private final List<VFSLeafEditor> editors;
+	private final List<DocEditor> editors;
 	
 	@Autowired
-	private VFSRepositoryService vfsService;
+	private DocumentEditorService editorService;
 
-	public VFSLeafConfigController(UserRequest ureq, WindowControl wControl, VFSLeaf vfsLeaf,
-			VFSLeafEditorSecurityCallback secCallback) {
+	public DocEditorConfigController(UserRequest ureq, WindowControl wControl, VFSLeaf vfsLeaf,
+			DocEditorSecurityCallback secCallback) {
 		super(ureq, wControl);
 		this.guiEditorKey = getGuiPrefixKey(vfsLeaf);
 		String suffix = FileUtils.getFileSuffix(vfsLeaf.getName());
-		editors = vfsService.getEditors(suffix, secCallback.getMode());
+		editors = editorService.getEditors(suffix, secCallback.getMode());
 		
 		VelocityContainer mainVC = createVelocityContainer("editor_config");
 		
@@ -79,7 +79,7 @@ public class VFSLeafConfigController extends BasicController implements Activate
 			editorDropdown = new Dropdown("editor.selection", null, false, getTranslator());
 			editorDropdown.setTranslatedLabel(editors.get(0).getDisplayName(getLocale()));
 			editorDropdown.setButton(true);
-			for (VFSLeafEditor editor : editors) {
+			for (DocEditor editor : editors) {
 				Link editorLink = LinkFactory.createToolLink(editor.getType(), "select", editor.getDisplayName(getLocale()), this);
 				editorLink.setUserObject(editor);
 				editorDropdown.addComponent(editorLink);
@@ -93,16 +93,16 @@ public class VFSLeafConfigController extends BasicController implements Activate
 	@Override
 	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
 		if (editors.size() >= 1) {
-			Optional<VFSLeafEditor> prefsEditor = getEditorFromGuiPrefs(ureq);
-			VFSLeafEditor initialEditor = prefsEditor.isPresent() && editorsContains(prefsEditor.get())
+			Optional<DocEditor> prefsEditor = getEditorFromGuiPrefs(ureq);
+			DocEditor initialEditor = prefsEditor.isPresent() && editorsContains(prefsEditor.get())
 					? prefsEditor.get()
 					: editors.get(0);
 			doSelectEditor(ureq, initialEditor);
 		}
 	}
 
-	private boolean editorsContains(VFSLeafEditor editor) {
-		for (VFSLeafEditor vfsLeafEditor : editors) {
+	private boolean editorsContains(DocEditor editor) {
+		for (DocEditor vfsLeafEditor : editors) {
 			if (vfsLeafEditor.getType().equals(editor.getType()) ) {
 				return true;
 			}
@@ -116,23 +116,23 @@ public class VFSLeafConfigController extends BasicController implements Activate
 			fireEvent(ureq, Event.DONE_EVENT);
 		} else if (source instanceof Link) {
 			Link link = (Link)source;
-			VFSLeafEditor editor = (VFSLeafEditor) link.getUserObject();
+			DocEditor editor = (DocEditor) link.getUserObject();
 			doSelectEditor(ureq, editor);
 		}
 	}
 
-	private void doSelectEditor(UserRequest ureq, VFSLeafEditor editor) {
+	private void doSelectEditor(UserRequest ureq, DocEditor editor) {
 		if (editorDropdown != null) {
 			editorDropdown.setTranslatedLabel(editor.getDisplayName(getLocale()));
 		}
 		saveEditorPrefs(ureq, editor);
-		fireEvent(ureq, new VFSEditorSelectionEvent(editor));
+		fireEvent(ureq, new DocEditorSelectionEvent(editor));
 	}
 	
-	private void saveEditorPrefs(UserRequest ureq, VFSLeafEditor editor) {
+	private void saveEditorPrefs(UserRequest ureq, DocEditor editor) {
 		Preferences guiPrefs = ureq.getUserSession().getGuiPreferences();
 		if (guiPrefs != null) {
-			guiPrefs.putAndSave(VFSLeafConfigController.class, guiEditorKey, editor.getType());
+			guiPrefs.putAndSave(DocEditorConfigController.class, guiEditorKey, editor.getType());
 		}
 	}
 
@@ -141,10 +141,10 @@ public class VFSLeafConfigController extends BasicController implements Activate
 		return GUIPREF_KEY_EDITOR + GUIPREF_SEPARATOR + suffix;
 	}
 	
-	private Optional<VFSLeafEditor> getEditorFromGuiPrefs(UserRequest ureq) {
+	private Optional<DocEditor> getEditorFromGuiPrefs(UserRequest ureq) {
 		Preferences guiPrefs = ureq.getUserSession().getGuiPreferences();
-		String editorType = (String) guiPrefs.get(VFSLeafConfigController.class, guiEditorKey);
-		return vfsService.getEditor(editorType);
+		String editorType = (String) guiPrefs.get(DocEditorConfigController.class, guiEditorKey);
+		return editorService.getEditor(editorType);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSLeafEditorController.java b/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorController.java
similarity index 70%
rename from src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSLeafEditorController.java
rename to src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorController.java
index 7e2f4c7fb44..46e3d1cf603 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSLeafEditorController.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorController.java
@@ -17,11 +17,11 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.core.commons.services.vfs.ui.editor;
+package org.olat.core.commons.services.doceditor.ui;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor;
-import org.olat.core.commons.services.vfs.VFSLeafEditorConfigs;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditor;
+import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.velocity.VelocityContainer;
@@ -37,23 +37,23 @@ import org.olat.core.util.vfs.VFSLeaf;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class VFSLeafEditorController extends BasicController {
+public class DocEditorController extends BasicController {
 	
 	private VelocityContainer mainVC;
-	private VFSLeafConfigController configCtrl;
+	private DocEditorConfigController configCtrl;
 	private Controller editorCtrl;
 
 	private final VFSLeaf vfsLeaf;
-	private final VFSLeafEditorSecurityCallback secCallback;
-	private final VFSLeafEditorConfigs configs;
+	private final DocEditorSecurityCallback secCallback;
+	private final DocEditorConfigs configs;
 	
-	public VFSLeafEditorController(UserRequest ureq, WindowControl wControl, VFSLeaf vfsLeaf,
-			VFSLeafEditorSecurityCallback secCallback, VFSLeafEditorConfigs configs) {
+	public DocEditorController(UserRequest ureq, WindowControl wControl, VFSLeaf vfsLeaf,
+			DocEditorSecurityCallback secCallback, DocEditorConfigs configs) {
 		this(ureq, wControl, vfsLeaf, secCallback, configs, null);
 	}
 	
-	public VFSLeafEditorController(UserRequest ureq, WindowControl wControl, VFSLeaf vfsLeaf,
-			VFSLeafEditorSecurityCallback secCallback, VFSLeafEditorConfigs configs, String cssClass) {
+	public DocEditorController(UserRequest ureq, WindowControl wControl, VFSLeaf vfsLeaf,
+			DocEditorSecurityCallback secCallback, DocEditorConfigs configs, String cssClass) {
 		super(ureq, wControl);
 		this.vfsLeaf = vfsLeaf;
 		this.secCallback = secCallback;
@@ -62,7 +62,7 @@ public class VFSLeafEditorController extends BasicController {
 		mainVC = createVelocityContainer("editor_main");
 		mainVC.contextPut("cssClass", cssClass);
 		
-		configCtrl = new VFSLeafConfigController(ureq, wControl, vfsLeaf, secCallback);
+		configCtrl = new DocEditorConfigController(ureq, wControl, vfsLeaf, secCallback);
 		listenTo(configCtrl);
 		mainVC.put("config", configCtrl.getInitialComponent());
 		configCtrl.activate(ureq, null, null);
@@ -77,9 +77,9 @@ public class VFSLeafEditorController extends BasicController {
 	@Override
 	protected void event(UserRequest ureq, Controller source, Event event) {
 		if (source == configCtrl) {
-			if (event instanceof VFSEditorSelectionEvent) {
-				VFSEditorSelectionEvent esEvent = (VFSEditorSelectionEvent) event;
-				VFSLeafEditor editor = esEvent.getEditor();
+			if (event instanceof DocEditorSelectionEvent) {
+				DocEditorSelectionEvent esEvent = (DocEditorSelectionEvent) event;
+				DocEditor editor = esEvent.getEditor();
 				doOpenEditor(ureq, editor);
 			} else if (event == Event.DONE_EVENT) {
 				fireEvent(ureq, event);
@@ -90,7 +90,7 @@ public class VFSLeafEditorController extends BasicController {
 		super.event(ureq, source, event);
 	}
 
-	private void doOpenEditor(UserRequest ureq, VFSLeafEditor editor) {
+	private void doOpenEditor(UserRequest ureq, DocEditor editor) {
 		removeAsListenerAndDispose(editorCtrl);
 		
 		if (editorCtrl != null) mainVC.remove("editor");
diff --git a/src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSLeafEditorFullscreenController.java b/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorFullscreenController.java
similarity index 75%
rename from src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSLeafEditorFullscreenController.java
rename to src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorFullscreenController.java
index 1dac849bf6c..2b4e1e42f41 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSLeafEditorFullscreenController.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorFullscreenController.java
@@ -17,10 +17,10 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.core.commons.services.vfs.ui.editor;
+package org.olat.core.commons.services.doceditor.ui;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditorConfigs;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.control.ChiefController;
@@ -37,28 +37,28 @@ import org.olat.core.util.vfs.VFSLeaf;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class VFSLeafEditorFullscreenController extends BasicController {
+public class DocEditorFullscreenController extends BasicController {
 	
-	private VFSLeafEditorController editorCtrl;
+	private DocEditorController editorCtrl;
 	
 	private final VFSLeaf vfsLeaf;
 
-	public VFSLeafEditorFullscreenController(UserRequest ureq, WindowControl wControl, VFSLeaf vfsLeaf,
-			VFSLeafEditorSecurityCallback secCallback, VFSLeafEditorConfigs configs) {
+	public DocEditorFullscreenController(UserRequest ureq, WindowControl wControl, VFSLeaf vfsLeaf,
+			DocEditorSecurityCallback secCallback, DocEditorConfigs configs) {
 		super(ureq, wControl);
 		this.vfsLeaf = vfsLeaf;
 		
-		editorCtrl = new VFSLeafEditorController(ureq, wControl, vfsLeaf, secCallback, configs);
+		editorCtrl = new DocEditorController(ureq, wControl, vfsLeaf, secCallback, configs);
 		listenTo(editorCtrl);
 		doOpenEditor();
 	}
 	
-	public VFSLeafEditorFullscreenController(UserRequest ureq, WindowControl wControl, VFSLeaf vfsLeaf,
-			VFSLeafEditorSecurityCallback secCallback, VFSLeafEditorConfigs configs, String cssClass) {
+	public DocEditorFullscreenController(UserRequest ureq, WindowControl wControl, VFSLeaf vfsLeaf,
+			DocEditorSecurityCallback secCallback, DocEditorConfigs configs, String cssClass) {
 		super(ureq, wControl);
 		this.vfsLeaf = vfsLeaf;
 		
-		editorCtrl = new VFSLeafEditorController(ureq, wControl, vfsLeaf, secCallback, configs, cssClass);
+		editorCtrl = new DocEditorController(ureq, wControl, vfsLeaf, secCallback, configs, cssClass);
 		listenTo(editorCtrl);
 		doOpenEditor();
 	}
diff --git a/src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSEditorSelectionEvent.java b/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorSelectionEvent.java
similarity index 79%
rename from src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSEditorSelectionEvent.java
rename to src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorSelectionEvent.java
index ae1812ac460..f2805917343 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/ui/editor/VFSEditorSelectionEvent.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorSelectionEvent.java
@@ -17,9 +17,9 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.core.commons.services.vfs.ui.editor;
+package org.olat.core.commons.services.doceditor.ui;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor;
+import org.olat.core.commons.services.doceditor.DocEditor;
 import org.olat.core.gui.control.Event;
 
 /**
@@ -28,18 +28,18 @@ import org.olat.core.gui.control.Event;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class VFSEditorSelectionEvent extends Event {
+public class DocEditorSelectionEvent extends Event {
 
 	private static final long serialVersionUID = 5012841554626419194L;
 
-	private final VFSLeafEditor editor;
+	private final DocEditor editor;
 
-	public VFSEditorSelectionEvent(VFSLeafEditor editor) {
+	public DocEditorSelectionEvent(DocEditor editor) {
 		super("editor-selected");
 		this.editor = editor;
 	}
 
-	public VFSLeafEditor getEditor() {
+	public DocEditor getEditor() {
 		return editor;
 	}
 
diff --git a/src/main/java/org/olat/core/commons/services/filetemplate/ui/_content/create_file.html b/src/main/java/org/olat/core/commons/services/doceditor/ui/_content/create_document.html
similarity index 82%
rename from src/main/java/org/olat/core/commons/services/filetemplate/ui/_content/create_file.html
rename to src/main/java/org/olat/core/commons/services/doceditor/ui/_content/create_document.html
index 12fe391784d..eecc30d83e3 100644
--- a/src/main/java/org/olat/core/commons/services/filetemplate/ui/_content/create_file.html
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/_content/create_document.html
@@ -1,5 +1,5 @@
 <div class="o_sel_folder_new_file">
-$r.render("file")
+$r.render("doc")
 $r.render("metadata")
 $r.render("buttons")
 </div>
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/ui/_content/editor_config.html b/src/main/java/org/olat/core/commons/services/doceditor/ui/_content/editor_config.html
new file mode 100644
index 00000000000..912fdfc9d6b
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/_content/editor_config.html
@@ -0,0 +1,18 @@
+<div class="o_vfseditor_config">
+	<div class="navbar-collapse">
+		#if($r.available("backLink"))
+			<ul class="nav navbar-nav navbar-left">
+				<li>
+					$r.render("backLink")
+				</li>
+			</ul>
+		#end
+		#if($r.available("editor.selection"))
+			<ul class="nav navbar-nav navbar-right">
+				<li>
+					$r.render("editor.selection")
+				</li>
+			</ul>
+		#end
+	</div>
+</div>
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/ui/_content/editor_main.html b/src/main/java/org/olat/core/commons/services/doceditor/ui/_content/editor_main.html
new file mode 100644
index 00000000000..b67c3b2dda4
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/_content/editor_main.html
@@ -0,0 +1,10 @@
+<div class="o_vfseditor $!cssClass">
+	$r.render("config")
+	#if($r.available("editor"))
+		$r.render("editor")
+	#else
+		<div class="o_warning">
+			$r.translate("error.no.editor")
+		</div>
+	#end
+</div>
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties
new file mode 100644
index 00000000000..ddaf26b4ee7
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties
@@ -0,0 +1,12 @@
+create.doc.already.exists=$org.olat.core.commons.modules.bc\:cdoc.already.exists
+create.doc.button=Dokument erstellen
+create.doc.name.notvalid=$org.olat.core.commons.modules.bc\:cdoc.name.notvalid
+create.doc.name=Dateiname
+create.doc.type=Dateityp
+doc.type.css=Cascading Style Sheet
+doc.type.docx=Word
+doc.type.html=HTML-Dokument
+doc.type.pptx=PowerPoint
+doc.type.txt=Text
+doc.type.xlsx=Excel
+error.no.editor=Die Datei kann nicht angezeigt werden.
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties
new file mode 100644
index 00000000000..9a46c8358aa
--- /dev/null
+++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties
@@ -0,0 +1,12 @@
+create.doc.already.exists=$org.olat.core.commons.modules.bc\:cdoc.already.exists
+create.doc.button=Create document
+create.doc.name.notvalid=$org.olat.core.commons.modules.bc\:cdoc.name.notvalid
+create.doc.name=File name
+create.doc.type=Type
+doc.type.css=Cascading Style Sheet
+doc.type.docx=Word
+doc.type.html=HTML Document
+doc.type.pptx=PowerPoint
+doc.type.txt=Text
+doc.type.xlsx=Excel
+error.no.editor=The content of the document cannot be displayed.
diff --git a/src/main/java/org/olat/modules/wopi/Access.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/Access.java
similarity index 95%
rename from src/main/java/org/olat/modules/wopi/Access.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/Access.java
index ca2964f1927..b3914490172 100644
--- a/src/main/java/org/olat/modules/wopi/Access.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/Access.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi;
+package org.olat.core.commons.services.doceditor.wopi;
 
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.id.Identity;
diff --git a/src/main/java/org/olat/modules/wopi/Action.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/Action.java
similarity index 95%
rename from src/main/java/org/olat/modules/wopi/Action.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/Action.java
index e173ebfeb78..c353bf01c23 100644
--- a/src/main/java/org/olat/modules/wopi/Action.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/Action.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi;
+package org.olat.core.commons.services.doceditor.wopi;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/wopi/App.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/App.java
similarity index 95%
rename from src/main/java/org/olat/modules/wopi/App.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/App.java
index 59bfe83d31a..4d9c8e11f76 100644
--- a/src/main/java/org/olat/modules/wopi/App.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/App.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi;
+package org.olat.core.commons.services.doceditor.wopi;
 
 import java.util.List;
 
diff --git a/src/main/java/org/olat/modules/wopi/Discovery.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/Discovery.java
similarity index 95%
rename from src/main/java/org/olat/modules/wopi/Discovery.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/Discovery.java
index 41d60563196..af3882eb318 100644
--- a/src/main/java/org/olat/modules/wopi/Discovery.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/Discovery.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi;
+package org.olat.core.commons.services.doceditor.wopi;
 
 import java.util.List;
 
diff --git a/src/main/java/org/olat/modules/wopi/NetZone.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/NetZone.java
similarity index 94%
rename from src/main/java/org/olat/modules/wopi/NetZone.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/NetZone.java
index 34c58062e00..51c4e0f763d 100644
--- a/src/main/java/org/olat/modules/wopi/NetZone.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/NetZone.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi;
+package org.olat.core.commons.services.doceditor.wopi;
 
 import java.util.List;
 
diff --git a/src/main/java/org/olat/modules/wopi/ProofKey.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/ProofKey.java
similarity index 95%
rename from src/main/java/org/olat/modules/wopi/ProofKey.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/ProofKey.java
index 9ef70322f0f..f8bd8e8762a 100644
--- a/src/main/java/org/olat/modules/wopi/ProofKey.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/ProofKey.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi;
+package org.olat.core.commons.services.doceditor.wopi;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/wopi/WopiDiscoveryClient.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/WopiDiscoveryClient.java
similarity index 95%
rename from src/main/java/org/olat/modules/wopi/WopiDiscoveryClient.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/WopiDiscoveryClient.java
index ba2507c8ad2..df803da162c 100644
--- a/src/main/java/org/olat/modules/wopi/WopiDiscoveryClient.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/WopiDiscoveryClient.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi;
+package org.olat.core.commons.services.doceditor.wopi;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/wopi/WopiRestHelper.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/WopiRestHelper.java
similarity index 96%
rename from src/main/java/org/olat/modules/wopi/WopiRestHelper.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/WopiRestHelper.java
index e5324940d86..3419a8f19a0 100644
--- a/src/main/java/org/olat/modules/wopi/WopiRestHelper.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/WopiRestHelper.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi;
+package org.olat.core.commons.services.doceditor.wopi;
 
 import java.io.File;
 import java.time.Instant;
diff --git a/src/main/java/org/olat/modules/wopi/WopiService.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/WopiService.java
similarity index 90%
rename from src/main/java/org/olat/modules/wopi/WopiService.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/WopiService.java
index adb144c397d..a17d2fe4399 100644
--- a/src/main/java/org/olat/modules/wopi/WopiService.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/WopiService.java
@@ -17,11 +17,11 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi;
+package org.olat.core.commons.services.doceditor.wopi;
 
 import java.io.File;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.id.Identity;
 import org.olat.core.util.vfs.VFSLeaf;
@@ -42,7 +42,7 @@ public interface WopiService {
 
 	VFSMetadata getMetadata(String fileId);
 
-	Access createAccess(VFSMetadata vfsMetadata, Identity identity, VFSLeafEditorSecurityCallback secCallback);
+	Access createAccess(VFSMetadata vfsMetadata, Identity identity, DocEditorSecurityCallback secCallback);
 
 	Access getAccess(String accessToken);
 	
diff --git a/src/main/java/org/olat/modules/wopi/manager/WopiDiscoveryClientImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiDiscoveryClientImpl.java
similarity index 90%
rename from src/main/java/org/olat/modules/wopi/manager/WopiDiscoveryClientImpl.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiDiscoveryClientImpl.java
index c4cef1b4cfa..377f7e5a774 100644
--- a/src/main/java/org/olat/modules/wopi/manager/WopiDiscoveryClientImpl.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiDiscoveryClientImpl.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.manager;
+package org.olat.core.commons.services.doceditor.wopi.manager;
 
 import org.apache.http.HttpEntity;
 import org.apache.http.client.config.RequestConfig;
@@ -26,11 +26,11 @@ import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
+import org.olat.core.commons.services.doceditor.wopi.Discovery;
+import org.olat.core.commons.services.doceditor.wopi.WopiDiscoveryClient;
+import org.olat.core.commons.services.doceditor.wopi.model.DiscoveryImpl;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
-import org.olat.modules.wopi.Discovery;
-import org.olat.modules.wopi.WopiDiscoveryClient;
-import org.olat.modules.wopi.model.DiscoveryImpl;
 import org.springframework.stereotype.Service;
 
 /**
diff --git a/src/main/java/org/olat/modules/wopi/manager/WopiServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiServiceImpl.java
similarity index 86%
rename from src/main/java/org/olat/modules/wopi/manager/WopiServiceImpl.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiServiceImpl.java
index 583ff0f4ffc..3dc229fb649 100644
--- a/src/main/java/org/olat/modules/wopi/manager/WopiServiceImpl.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiServiceImpl.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.manager;
+package org.olat.core.commons.services.doceditor.wopi.manager;
 
 import java.io.File;
 import java.net.URL;
@@ -27,8 +27,15 @@ import java.util.UUID;
 
 import javax.annotation.PostConstruct;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.commons.services.doceditor.wopi.Access;
+import org.olat.core.commons.services.doceditor.wopi.Action;
+import org.olat.core.commons.services.doceditor.wopi.App;
+import org.olat.core.commons.services.doceditor.wopi.Discovery;
+import org.olat.core.commons.services.doceditor.wopi.NetZone;
+import org.olat.core.commons.services.doceditor.wopi.WopiService;
+import org.olat.core.commons.services.doceditor.wopi.model.AccessImpl;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.commons.services.vfs.VFSRepositoryService;
 import org.olat.core.id.Identity;
@@ -38,13 +45,6 @@ import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.vfs.VFSLeaf;
-import org.olat.modules.wopi.Access;
-import org.olat.modules.wopi.Action;
-import org.olat.modules.wopi.App;
-import org.olat.modules.wopi.Discovery;
-import org.olat.modules.wopi.NetZone;
-import org.olat.modules.wopi.WopiService;
-import org.olat.modules.wopi.model.AccessImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -106,7 +106,7 @@ public class WopiServiceImpl implements WopiService {
 	}
 
 	@Override
-	public Access createAccess(VFSMetadata vfsMetadata, Identity identity, VFSLeafEditorSecurityCallback secCallback) {
+	public Access createAccess(VFSMetadata vfsMetadata, Identity identity, DocEditorSecurityCallback secCallback) {
 		String token = UUID.randomUUID().toString().replaceAll("-", "");
 		String fileId = vfsMetadata.getUuid();
 		
diff --git a/src/main/java/org/olat/modules/wopi/manager/WopiXStream.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiXStream.java
similarity index 88%
rename from src/main/java/org/olat/modules/wopi/manager/WopiXStream.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiXStream.java
index 47b5908c550..63ad5d6c4fe 100644
--- a/src/main/java/org/olat/modules/wopi/manager/WopiXStream.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiXStream.java
@@ -17,14 +17,14 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.manager;
+package org.olat.core.commons.services.doceditor.wopi.manager;
 
+import org.olat.core.commons.services.doceditor.wopi.model.ActionImpl;
+import org.olat.core.commons.services.doceditor.wopi.model.AppImpl;
+import org.olat.core.commons.services.doceditor.wopi.model.DiscoveryImpl;
+import org.olat.core.commons.services.doceditor.wopi.model.NetZoneImpl;
+import org.olat.core.commons.services.doceditor.wopi.model.ProofKeyImpl;
 import org.olat.core.util.xml.XStreamHelper;
-import org.olat.modules.wopi.model.ActionImpl;
-import org.olat.modules.wopi.model.AppImpl;
-import org.olat.modules.wopi.model.DiscoveryImpl;
-import org.olat.modules.wopi.model.NetZoneImpl;
-import org.olat.modules.wopi.model.ProofKeyImpl;
 
 import com.thoughtworks.xstream.XStream;
 import com.thoughtworks.xstream.security.ExplicitTypePermission;
diff --git a/src/main/java/org/olat/modules/wopi/model/AccessImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/model/AccessImpl.java
similarity index 94%
rename from src/main/java/org/olat/modules/wopi/model/AccessImpl.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/model/AccessImpl.java
index feb021715f5..8b0b8b2e553 100644
--- a/src/main/java/org/olat/modules/wopi/model/AccessImpl.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/model/AccessImpl.java
@@ -17,11 +17,11 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.model;
+package org.olat.core.commons.services.doceditor.wopi.model;
 
+import org.olat.core.commons.services.doceditor.wopi.Access;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.id.Identity;
-import org.olat.modules.wopi.Access;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/wopi/model/ActionImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/model/ActionImpl.java
similarity index 93%
rename from src/main/java/org/olat/modules/wopi/model/ActionImpl.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/model/ActionImpl.java
index 8db08b66f0d..c7c736e0e28 100644
--- a/src/main/java/org/olat/modules/wopi/model/ActionImpl.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/model/ActionImpl.java
@@ -17,9 +17,9 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.model;
+package org.olat.core.commons.services.doceditor.wopi.model;
 
-import org.olat.modules.wopi.Action;
+import org.olat.core.commons.services.doceditor.wopi.Action;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/wopi/model/AppImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/model/AppImpl.java
similarity index 90%
rename from src/main/java/org/olat/modules/wopi/model/AppImpl.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/model/AppImpl.java
index f105a4bbc1e..8b6d082b43e 100644
--- a/src/main/java/org/olat/modules/wopi/model/AppImpl.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/model/AppImpl.java
@@ -17,12 +17,12 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.model;
+package org.olat.core.commons.services.doceditor.wopi.model;
 
 import java.util.List;
 
-import org.olat.modules.wopi.Action;
-import org.olat.modules.wopi.App;
+import org.olat.core.commons.services.doceditor.wopi.Action;
+import org.olat.core.commons.services.doceditor.wopi.App;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/wopi/model/DiscoveryImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/model/DiscoveryImpl.java
similarity index 84%
rename from src/main/java/org/olat/modules/wopi/model/DiscoveryImpl.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/model/DiscoveryImpl.java
index d81e9dfa465..5c8d4c52fdf 100644
--- a/src/main/java/org/olat/modules/wopi/model/DiscoveryImpl.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/model/DiscoveryImpl.java
@@ -17,13 +17,13 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.model;
+package org.olat.core.commons.services.doceditor.wopi.model;
 
 import java.util.List;
 
-import org.olat.modules.wopi.Discovery;
-import org.olat.modules.wopi.NetZone;
-import org.olat.modules.wopi.ProofKey;
+import org.olat.core.commons.services.doceditor.wopi.Discovery;
+import org.olat.core.commons.services.doceditor.wopi.NetZone;
+import org.olat.core.commons.services.doceditor.wopi.ProofKey;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/wopi/model/NetZoneImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/model/NetZoneImpl.java
similarity index 87%
rename from src/main/java/org/olat/modules/wopi/model/NetZoneImpl.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/model/NetZoneImpl.java
index 9f57b9cd109..d1111bc14e8 100644
--- a/src/main/java/org/olat/modules/wopi/model/NetZoneImpl.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/model/NetZoneImpl.java
@@ -17,12 +17,12 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.model;
+package org.olat.core.commons.services.doceditor.wopi.model;
 
 import java.util.List;
 
-import org.olat.modules.wopi.App;
-import org.olat.modules.wopi.NetZone;
+import org.olat.core.commons.services.doceditor.wopi.App;
+import org.olat.core.commons.services.doceditor.wopi.NetZone;
 
 /**
  * 
diff --git a/src/main/java/org/olat/modules/wopi/model/ProofKeyImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/model/ProofKeyImpl.java
similarity index 94%
rename from src/main/java/org/olat/modules/wopi/model/ProofKeyImpl.java
rename to src/main/java/org/olat/core/commons/services/doceditor/wopi/model/ProofKeyImpl.java
index 54e94477e33..2fa68611390 100644
--- a/src/main/java/org/olat/modules/wopi/model/ProofKeyImpl.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/model/ProofKeyImpl.java
@@ -17,9 +17,9 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.model;
+package org.olat.core.commons.services.doceditor.wopi.model;
 
-import org.olat.modules.wopi.ProofKey;
+import org.olat.core.commons.services.doceditor.wopi.ProofKey;
 
 /**
  * 
diff --git a/src/main/java/org/olat/core/commons/services/filetemplate/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/services/filetemplate/ui/_i18n/LocalStrings_de.properties
deleted file mode 100644
index b16cb8ff318..00000000000
--- a/src/main/java/org/olat/core/commons/services/filetemplate/ui/_i18n/LocalStrings_de.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-create.file.already.exists=$org.olat.core.commons.modules.bc\:cfile.already.exists
-create.file.button=Dokument erstellen
-create.file.name=Dateiname
-create.file.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid
-create.file.type=Dateityp
-file.type.css=Cascading Style Sheet
-file.type.docx=Word
-file.type.html=HTML-Dokument
-file.type.pptx=PowerPoint
-file.type.txt=Text
-file.type.xlsx=Excel
diff --git a/src/main/java/org/olat/core/commons/services/filetemplate/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/commons/services/filetemplate/ui/_i18n/LocalStrings_en.properties
deleted file mode 100644
index b39cfd71285..00000000000
--- a/src/main/java/org/olat/core/commons/services/filetemplate/ui/_i18n/LocalStrings_en.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-create.file.already.exists=$org.olat.core.commons.modules.bc\:cfile.already.exists
-create.file.button=Create document
-create.file.name=File name
-create.file.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid
-create.file.type=Type
-file.type.css=Cascading Style Sheet
-file.type.docx=Word
-file.type.html=HTML Document
-file.type.pptx=PowerPoint
-file.type.txt=Text
-file.type.xlsx=Excel
diff --git a/src/main/java/org/olat/core/commons/services/vfs/VFSRepositoryService.java b/src/main/java/org/olat/core/commons/services/vfs/VFSRepositoryService.java
index 1a5248e61c5..2a1a076cf24 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/VFSRepositoryService.java
+++ b/src/main/java/org/olat/core/commons/services/vfs/VFSRepositoryService.java
@@ -22,10 +22,8 @@ package org.olat.core.commons.services.vfs;
 import java.io.File;
 import java.io.InputStream;
 import java.util.List;
-import java.util.Optional;
 
 import org.olat.core.commons.services.license.License;
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
 import org.olat.core.id.Identity;
 import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.VFSItem;
@@ -257,45 +255,5 @@ public interface VFSRepositoryService {
 	public License getLicense(VFSMetadata meta);
 	
 	public License getOrCreateLicense(VFSMetadata meta, Identity itentity);
-	
-	
-	/**
-	 * Check if file with a specific suffix is supported by any enabled editor.
-	 *
-	 * @param suffix
-	 * @param mode
-	 * @return
-	 */
-	public boolean hasEditor(String suffix, Mode mode);
-	
-	/**
-	 * Get all enabled editors which support a file with a specific suffix. Support means usually edit or read.
-	 *
-	 * @param suffix
-	 * @param mode
-	 * @return
-	 */
-	public List<VFSLeafEditor> getEditors(String suffix, Mode mode);
-	
-	/**
-	 * Get the editor of a specific type.
-	 * 
-	 * @param editorType
-	 * @return
-	 */
-	public Optional<VFSLeafEditor> getEditor(String editorType);
-	
-	/**
-	 * Checks whether a vfsLeaf can be opened in any editor by a user and in a
-	 * specific mode. This method checks not only if a file format is supported but
-	 * also if the vfsLeaf is not locked by an other editor or user.
-	 *
-	 * @param vfsLeaf
-	 * @param mode
-	 * @param identity
-	 * @return
-	 */
-	public boolean hasEditor(VFSLeaf vfsLeaf, Mode mode, Identity identity);
-
 
 }
diff --git a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java
index 289683fc957..fdf806c9006 100644
--- a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java
+++ b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java
@@ -42,10 +42,8 @@ import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
 import java.util.zip.Adler32;
 import java.util.zip.Checksum;
 
@@ -62,8 +60,6 @@ import org.olat.core.commons.services.license.LicenseType;
 import org.olat.core.commons.services.thumbnail.CannotGenerateThumbnailException;
 import org.olat.core.commons.services.thumbnail.FinalSize;
 import org.olat.core.commons.services.thumbnail.ThumbnailService;
-import org.olat.core.commons.services.vfs.VFSLeafEditor;
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.commons.services.vfs.VFSMetadataRef;
 import org.olat.core.commons.services.vfs.VFSRepositoryModule;
@@ -138,8 +134,6 @@ public class VFSRepositoryServiceImpl implements VFSRepositoryService, GenericEv
 	private CoordinatorManager coordinatorManager;
 	@Autowired
 	private BaseSecurity securityManager;
-	@Autowired
-	private List<VFSLeafEditor> vfsLeafEditors;
 	
 	@Override
 	public void afterPropertiesSet() throws Exception {
@@ -1330,45 +1324,4 @@ public class VFSRepositoryServiceImpl implements VFSRepositoryService, GenericEv
 		return fVersion.exists() ? fVersion : null;
 	}
 
-	@Override
-	public boolean hasEditor(String suffix, Mode mode) {
-		if (mode == null) return false;
-		
-		return vfsLeafEditors.stream()
-				.filter(VFSLeafEditor::isEnable)
-				.filter(editor -> editor.isSupportingFormat(suffix, mode))
-				.findFirst()
-				.isPresent();
-	}
-
-	@Override
-	public List<VFSLeafEditor> getEditors(String suffix, Mode mode) {
-		return vfsLeafEditors.stream()
-				.filter(VFSLeafEditor::isEnable)
-				.filter(editor -> editor.isSupportingFormat(suffix, mode))
-				.collect(Collectors.toList());
-	}
-
-	@Override
-	public Optional<VFSLeafEditor> getEditor(String editorType) {
-		return vfsLeafEditors.stream()
-				.filter(VFSLeafEditor::isEnable)
-				.filter(editor -> editor.getType().equals(editorType))
-				.findFirst();
-	}
-	
-	@Override
-	public boolean hasEditor(VFSLeaf vfsLeaf, Mode mode, Identity identity) {
-		if (mode == null) return false;
-		
-		String suffix = FileUtils.getFileSuffix(vfsLeaf.getName());
-		return vfsLeafEditors.stream()
-				.filter(VFSLeafEditor::isEnable)
-				.filter(editor -> editor.isSupportingFormat(suffix, mode))
-				.filter(editor -> !editor.isLockedForMe(vfsLeaf, mode, identity))
-				.findFirst()
-				.isPresent();
-		
-	}
-
 }
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/AbstractAssignmentEditController.java b/src/main/java/org/olat/course/nodes/gta/ui/AbstractAssignmentEditController.java
index abe48edf642..1aac1f09580 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/AbstractAssignmentEditController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/AbstractAssignmentEditController.java
@@ -19,20 +19,20 @@
  */
 package org.olat.course.nodes.gta.ui;
 
-import static org.olat.core.commons.services.vfs.VFSLeafEditor.Mode.EDIT;
+import static org.olat.core.commons.services.doceditor.DocEditor.Mode.EDIT;
+import static org.olat.course.nodes.gta.ui.GTAUIFactory.getOpenMode;
 import static org.olat.course.nodes.gta.ui.GTAUIFactory.htmlOffice;
 
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallbackBuilder;
+import org.olat.core.commons.services.doceditor.ui.DocEditorFullscreenController;
 import org.olat.core.commons.services.notifications.NotificationsManager;
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
-import org.olat.core.commons.services.vfs.VFSLeafEditorConfigs;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallbackBuilder;
-import org.olat.core.commons.services.vfs.VFSRepositoryService;
-import org.olat.core.commons.services.vfs.ui.editor.VFSLeafEditorFullscreenController;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
@@ -90,7 +90,7 @@ abstract class AbstractAssignmentEditController extends FormBasicController {
 	private NewTaskController newTaskCtrl;
 	private DialogBoxController confirmDeleteCtrl;
 	private EditTaskController addTaskCtrl, editTaskCtrl;
-	private VFSLeafEditorFullscreenController vfsLeafEditorCtrl;
+	private DocEditorFullscreenController docEditorCtrl;
 	
 	private final File tasksFolder;
 	protected final boolean readOnly;
@@ -106,8 +106,6 @@ abstract class AbstractAssignmentEditController extends FormBasicController {
 	protected GTAManager gtaManager;
 	@Autowired
 	protected NotificationsManager notificationsManager;
-	@Autowired
-	protected VFSRepositoryService vfsService;
 	
 	public AbstractAssignmentEditController(UserRequest ureq, WindowControl wControl,
 			GTACourseNode gtaNode, ModuleConfiguration config, CourseEnvironment courseEnv, boolean readOnly) {
@@ -169,7 +167,7 @@ abstract class AbstractAssignmentEditController extends FormBasicController {
 				VFSLeaf vfsLeaf = (VFSLeaf)item;
 				downloadLink = uifactory
 					.addDownloadLink("file_" + (++linkCounter), def.getFilename(), null, vfsLeaf, taskDefTableEl);
-				mode = getOpenMode(vfsLeaf);
+				mode = getOpenMode(vfsLeaf, getIdentity(), readOnly);
 			}
 			
 			TaskDefinitionRow row = new TaskDefinitionRow(def, downloadLink, mode);
@@ -179,15 +177,6 @@ abstract class AbstractAssignmentEditController extends FormBasicController {
 		taskDefTableEl.reset();
 	}
 	
-	private Mode getOpenMode(VFSLeaf vfsLeaf) {
-		if (!readOnly && vfsService.hasEditor(vfsLeaf, Mode.EDIT, getIdentity())) {
-			return Mode.EDIT;
-		} else if (vfsService.hasEditor(vfsLeaf, Mode.VIEW, getIdentity())) {
-			return Mode.VIEW;
-		}
-		return null;
-	}
-	
 	@Override
 	protected void doDispose() {
 		//
@@ -225,7 +214,7 @@ abstract class AbstractAssignmentEditController extends FormBasicController {
 				doOpen(ureq, newTask, EDIT);
 				updateModel();
 			} 
-		} else if (source == vfsLeafEditorCtrl) {
+		} else if (source == docEditorCtrl) {
 			if(event == Event.DONE_EVENT) {
 				gtaManager.markNews(courseEnv, gtaNode);
 				updateModel();
@@ -245,12 +234,12 @@ abstract class AbstractAssignmentEditController extends FormBasicController {
 	
 	private void cleanUp() {
 		removeAsListenerAndDispose(confirmDeleteCtrl);
-		removeAsListenerAndDispose(vfsLeafEditorCtrl);
+		removeAsListenerAndDispose(docEditorCtrl);
 		removeAsListenerAndDispose(editTaskCtrl);
 		removeAsListenerAndDispose(addTaskCtrl);
 		removeAsListenerAndDispose(cmc);
 		confirmDeleteCtrl = null;
-		vfsLeafEditorCtrl = null;
+		docEditorCtrl = null;
 		editTaskCtrl = null;
 		addTaskCtrl = null;
 		cmc = null;
@@ -327,12 +316,12 @@ abstract class AbstractAssignmentEditController extends FormBasicController {
 		if(vfsItem == null || !(vfsItem instanceof VFSLeaf)) {
 			showError("error.missing.file");
 		} else {
-			VFSLeafEditorSecurityCallback secCallback = VFSLeafEditorSecurityCallbackBuilder.builder()
+			DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder()
 					.withMode(mode)
 					.build();
-			VFSLeafEditorConfigs configs = GTAUIFactory.getEditorConfig(tasksContainer, taskDef.getFilename(), courseRepoKey);
-			vfsLeafEditorCtrl = new VFSLeafEditorFullscreenController(ureq, getWindowControl(), (VFSLeaf)vfsItem, secCallback, configs);
-			listenTo(vfsLeafEditorCtrl);
+			DocEditorConfigs configs = GTAUIFactory.getEditorConfig(tasksContainer, taskDef.getFilename(), courseRepoKey);
+			docEditorCtrl = new DocEditorFullscreenController(ureq, getWindowControl(), (VFSLeaf)vfsItem, secCallback, configs);
+			listenTo(docEditorCtrl);
 		}
 	}
 	
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTASampleSolutionsEditController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTASampleSolutionsEditController.java
index e4db45044d3..6131d7d75d5 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTASampleSolutionsEditController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTASampleSolutionsEditController.java
@@ -19,19 +19,19 @@
  */
 package org.olat.course.nodes.gta.ui;
 
+import static org.olat.course.nodes.gta.ui.GTAUIFactory.getOpenMode;
 import static org.olat.course.nodes.gta.ui.GTAUIFactory.htmlOffice;
 
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
-import org.olat.core.commons.services.vfs.VFSLeafEditorConfigs;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallbackBuilder;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallbackBuilder;
+import org.olat.core.commons.services.doceditor.ui.DocEditorFullscreenController;
 import org.olat.core.commons.services.vfs.VFSMetadata;
-import org.olat.core.commons.services.vfs.VFSRepositoryService;
-import org.olat.core.commons.services.vfs.ui.editor.VFSLeafEditorFullscreenController;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
@@ -79,7 +79,7 @@ public class GTASampleSolutionsEditController extends FormBasicController {
 	private EditSolutionController addSolutionCtrl;
 	private EditSolutionController editSolutionCtrl;
 	private NewSolutionController newSolutionCtrl;
-	private VFSLeafEditorFullscreenController vfsLeafEditorCtrl;
+	private DocEditorFullscreenController docEditorCtrl;
 	
 	private final File solutionDir;
 	private final boolean readOnly;
@@ -94,8 +94,6 @@ public class GTASampleSolutionsEditController extends FormBasicController {
 	private UserManager userManager;
 	@Autowired
 	private GTAManager gtaManager;
-	@Autowired
-	private VFSRepositoryService vfsService;
 	
 	public GTASampleSolutionsEditController(UserRequest ureq, WindowControl wControl, GTACourseNode gtaNode,
 			CourseEnvironment courseEnv, boolean readOnly) {
@@ -160,7 +158,7 @@ public class GTASampleSolutionsEditController extends FormBasicController {
 				VFSLeaf vfsLeaf = (VFSLeaf)item;
 				downloadLink = uifactory
 					.addDownloadLink("file_" + (++linkCounter), filename, null, vfsLeaf, solutionTable);
-				openMode = getOpenMode(vfsLeaf);
+				openMode = getOpenMode(vfsLeaf, getIdentity(), readOnly);
 			}
 
 			rows.add(new SolutionRow(solution, author, downloadLink, openMode));
@@ -169,15 +167,6 @@ public class GTASampleSolutionsEditController extends FormBasicController {
 		solutionTable.reset();
 	}
 	
-	private Mode getOpenMode(VFSLeaf vfsLeaf) {
-		if (!readOnly && vfsService.hasEditor(vfsLeaf, Mode.EDIT, getIdentity())) {
-			return Mode.EDIT;
-		} else if (vfsService.hasEditor(vfsLeaf, Mode.VIEW, getIdentity())) {
-			return Mode.VIEW;
-		}
-		return null;
-	}
-	
 	@Override
 	protected void doDispose() {
 		//
@@ -215,7 +204,7 @@ public class GTASampleSolutionsEditController extends FormBasicController {
 				updateModel();
 				gtaManager.markNews(courseEnv, gtaNode);
 			}
-		} else if (source == vfsLeafEditorCtrl) {
+		} else if (source == docEditorCtrl) {
 			if(event == Event.DONE_EVENT) {
 				gtaManager.markNews(courseEnv, gtaNode);
 				updateModel();
@@ -228,11 +217,11 @@ public class GTASampleSolutionsEditController extends FormBasicController {
 	}
 	
 	private void cleanUp() {
-		removeAsListenerAndDispose(vfsLeafEditorCtrl);
+		removeAsListenerAndDispose(docEditorCtrl);
 		removeAsListenerAndDispose(editSolutionCtrl);
 		removeAsListenerAndDispose(addSolutionCtrl);
 		removeAsListenerAndDispose(cmc);
-		vfsLeafEditorCtrl = null;
+		docEditorCtrl = null;
 		editSolutionCtrl = null;
 		addSolutionCtrl = null;
 		cmc = null;
@@ -270,12 +259,12 @@ public class GTASampleSolutionsEditController extends FormBasicController {
 		if(vfsItem == null || !(vfsItem instanceof VFSLeaf)) {
 			showError("error.missing.file");
 		} else {
-			VFSLeafEditorSecurityCallback secCallback = VFSLeafEditorSecurityCallbackBuilder.builder()
+			DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder()
 					.withMode(mode)
 					.build();
-			VFSLeafEditorConfigs configs = GTAUIFactory.getEditorConfig(solutionContainer, solution.getFilename(), courseRepoKey);
-			vfsLeafEditorCtrl = new VFSLeafEditorFullscreenController(ureq, getWindowControl(), (VFSLeaf)vfsItem, secCallback, configs);
-			listenTo(vfsLeafEditorCtrl);
+			DocEditorConfigs configs = GTAUIFactory.getEditorConfig(solutionContainer, solution.getFilename(), courseRepoKey);
+			docEditorCtrl = new DocEditorFullscreenController(ureq, getWindowControl(), (VFSLeaf)vfsItem, secCallback, configs);
+			listenTo(docEditorCtrl);
 		}
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java
index dc05bc66ebf..ba3c345b977 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java
@@ -19,17 +19,20 @@
  */
 package org.olat.course.nodes.gta.ui;
 
-import static org.olat.core.commons.services.vfs.VFSLeafEditor.Mode.EDIT;
+import static org.olat.core.commons.services.doceditor.DocEditor.Mode.EDIT;
 
 import java.util.Locale;
 
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.editor.htmleditor.HTMLEditorConfig;
-import org.olat.core.commons.services.filetemplate.FileTypes;
-import org.olat.core.commons.services.filetemplate.FileTypes.Builder;
-import org.olat.core.commons.services.vfs.VFSLeafEditorConfigs;
-import org.olat.core.commons.services.vfs.VFSRepositoryService;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocTemplates;
+import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocumentEditorService;
+import org.olat.core.commons.services.doceditor.DocTemplates.Builder;
+import org.olat.core.id.Identity;
 import org.olat.core.util.vfs.VFSContainer;
+import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.modules.edusharing.VFSEdusharingProvider;
 import org.olat.repository.ui.settings.LazyRepositoryEdusharingProvider;
 
@@ -41,7 +44,17 @@ import org.olat.repository.ui.settings.LazyRepositoryEdusharingProvider;
  */
 class GTAUIFactory {
 	
-	static VFSLeafEditorConfigs getEditorConfig(VFSContainer vfsContainer, String filePath, Long courseRepoKey) {
+	static Mode getOpenMode(VFSLeaf vfsLeaf, Identity identity, boolean readOnly) {
+		DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class);
+		if (!readOnly && docEditorService.hasEditor(vfsLeaf, Mode.EDIT, identity)) {
+			return Mode.EDIT;
+		} else if (docEditorService.hasEditor(vfsLeaf, Mode.VIEW, identity)) {
+			return Mode.VIEW;
+		}
+		return null;
+	}
+	
+	static DocEditorConfigs getEditorConfig(VFSContainer vfsContainer, String filePath, Long courseRepoKey) {
 		VFSEdusharingProvider edusharingProvider = courseRepoKey != null
 				? new LazyRepositoryEdusharingProvider(courseRepoKey)
 				: null;
@@ -51,24 +64,24 @@ class GTAUIFactory {
 				.withDisableMedia(true)
 				.withEdusharingProvider(edusharingProvider)
 				.build();
-		 return VFSLeafEditorConfigs.builder()
+		 return DocEditorConfigs.builder()
 				.addConfig(htmlEditorConfig)
 				.build();
 	}
 	
-	static FileTypes htmlOffice(Locale locale) {
-		VFSRepositoryService vfsService = CoreSpringFactory.getImpl(VFSRepositoryService.class);
-		Builder builder = FileTypes.builder(locale);
-		if (vfsService.hasEditor("html", EDIT)) {
+	static DocTemplates htmlOffice(Locale locale) {
+		DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class);
+		Builder builder = DocTemplates.builder(locale);
+		if (docEditorService.hasEditor("html", EDIT)) {
 			builder.addHtml();
 		}
-		if (vfsService.hasEditor("docx", EDIT)) {
+		if (docEditorService.hasEditor("docx", EDIT)) {
 			builder.addDocx();
 		}
-		if (vfsService.hasEditor("xlsx", EDIT)) {
+		if (docEditorService.hasEditor("xlsx", EDIT)) {
 			builder.addXlsx();
 		}
-		if (vfsService.hasEditor("pptx", EDIT)) {
+		if (docEditorService.hasEditor("pptx", EDIT)) {
 			builder.addPptx();
 		}
 		return builder.build();
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/NewDocumentController.java b/src/main/java/org/olat/course/nodes/gta/ui/NewDocumentController.java
index e7d287d8d37..0ebaeaff964 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/NewDocumentController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/NewDocumentController.java
@@ -21,8 +21,8 @@ package org.olat.course.nodes.gta.ui;
 
 import java.util.List;
 
-import org.olat.core.commons.services.filetemplate.FileType;
-import org.olat.core.commons.services.filetemplate.FileTypes;
+import org.olat.core.commons.services.doceditor.DocTemplate;
+import org.olat.core.commons.services.doceditor.DocTemplates;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.commons.services.vfs.VFSRepositoryService;
 import org.olat.core.gui.UserRequest;
@@ -52,18 +52,18 @@ import org.springframework.beans.factory.annotation.Autowired;
 public class NewDocumentController extends FormBasicController {
 	
 	private TextElement filenameEl;
-	private SingleSelection fileTypeEl;
+	private SingleSelection docTypeEl;
 	private final VFSContainer documentContainer;
-	private final List<FileType> fileTypes;
+	private final List<DocTemplate> templates;
 	
 	@Autowired
 	private VFSRepositoryService vfsService;
 	
 	public NewDocumentController(UserRequest ureq, WindowControl wControl, VFSContainer documentContainer,
-			FileTypes fileTypes) {
+			DocTemplates templates) {
 		super(ureq, wControl);
 		this.documentContainer = documentContainer;
-		this.fileTypes = fileTypes.getFileTypes();
+		this.templates = templates.getTemplates();
 		initForm(ureq);
 	}
 
@@ -71,21 +71,21 @@ public class NewDocumentController extends FormBasicController {
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		formLayout.setElementCssClass("o_sel_course_gta_new_doc_form");
 		
-		String[] fileTypeKeys = new String[fileTypes.size()];
-		String[] fileTypeValues = new String[fileTypes.size()];
-		String[] fileTypeSuffix = new String[fileTypes.size()];
-		for (int i = 0; i < fileTypes.size(); i++) {
-			FileType fileType = fileTypes.get(i);
-			String name = fileType.getName() + " (." + fileType.getSuffix() + ")";
+		String[] fileTypeKeys = new String[templates.size()];
+		String[] fileTypeValues = new String[templates.size()];
+		String[] fileTypeSuffix = new String[templates.size()];
+		for (int i = 0; i < templates.size(); i++) {
+			DocTemplate docTemplate = templates.get(i);
+			String name = docTemplate.getName() + " (." + docTemplate.getSuffix() + ")";
 			fileTypeKeys[i] = String.valueOf(i);
 			fileTypeValues[i] = name;
-			fileTypeSuffix[i] = fileType.getSuffix();
+			fileTypeSuffix[i] = docTemplate.getSuffix();
 		}
-		fileTypeEl = uifactory.addDropdownSingleselect("file.type", formLayout, fileTypeKeys, fileTypeValues, fileTypeSuffix);
-		fileTypeEl.setElementCssClass("o_sel_course_gta_doc_filetype");
-		fileTypeEl.setMandatory(true);
-		if (fileTypes.size() == 1) {
-			fileTypeEl.setVisible(false);
+		docTypeEl = uifactory.addDropdownSingleselect("file.type", formLayout, fileTypeKeys, fileTypeValues, fileTypeSuffix);
+		docTypeEl.setElementCssClass("o_sel_course_gta_doc_filetype");
+		docTypeEl.setMandatory(true);
+		if (templates.size() == 1) {
+			docTypeEl.setVisible(false);
 		}
 		
 		filenameEl = uifactory.addTextElement("fileName", "file.name", -1, "", formLayout);
@@ -107,16 +107,16 @@ public class NewDocumentController extends FormBasicController {
 	
 	public String getFilename() {
 		String fileName = filenameEl.getValue().toLowerCase();
-		FileType fileType = getSelectedFileType();
-		String suffix = fileType != null? fileType.getSuffix(): "";
+		DocTemplate docTemplate = getSelectedTemplate();
+		String suffix = docTemplate != null? docTemplate.getSuffix(): "";
 		return fileName.endsWith("." + suffix)
 				? fileName
 				: fileName + "." + suffix;
 	}
 
-	private FileType getSelectedFileType() {
-		int index = fileTypeEl.getSelected();
-		return index >= 0? fileTypes.get(index): fileTypes.get(0);
+	private DocTemplate getSelectedTemplate() {
+		int index = docTypeEl.getSelected();
+		return index >= 0? templates.get(index): templates.get(0);
 	}
 
 	@Override
@@ -153,9 +153,9 @@ public class NewDocumentController extends FormBasicController {
 			documentName = VFSManager.rename(documentContainer, documentName);
 			vfsLeaf = documentContainer.createChildLeaf(documentName);
 		}
-		FileType fileType = getSelectedFileType();
-		if (fileType != null) {
-			VFSManager.copyContent(fileType.getContentProvider().getContent(), vfsLeaf);
+		DocTemplate docTemplate = getSelectedTemplate();
+		if (docTemplate != null) {
+			VFSManager.copyContent(docTemplate.getContentProvider().getContent(), vfsLeaf);
 		}
 		if(vfsLeaf.canMeta() == VFSConstants.YES) {
 			VFSMetadata metaInfo = vfsLeaf.getMetaInfo();
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/NewSolutionController.java b/src/main/java/org/olat/course/nodes/gta/ui/NewSolutionController.java
index b846564d53f..ae3761ae148 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/NewSolutionController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/NewSolutionController.java
@@ -21,8 +21,8 @@ package org.olat.course.nodes.gta.ui;
 
 import java.util.List;
 
-import org.olat.core.commons.services.filetemplate.FileType;
-import org.olat.core.commons.services.filetemplate.FileTypes;
+import org.olat.core.commons.services.doceditor.DocTemplate;
+import org.olat.core.commons.services.doceditor.DocTemplates;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.commons.services.vfs.VFSRepositoryService;
 import org.olat.core.gui.UserRequest;
@@ -53,17 +53,17 @@ import org.springframework.beans.factory.annotation.Autowired;
 public class NewSolutionController extends FormBasicController {
 	
 	private TextElement filenameEl, titleEl;
-	private SingleSelection fileTypeEl;
+	private SingleSelection docTypeEl;
 	private final VFSContainer documentContainer;
-	private final List<FileType> fileTypes;
+	private final List<DocTemplate> templates;
 	
 	@Autowired
 	private VFSRepositoryService vfsService;
 	
-	public NewSolutionController(UserRequest ureq, WindowControl wControl, VFSContainer documentContainer, FileTypes fileTypes) {
+	public NewSolutionController(UserRequest ureq, WindowControl wControl, VFSContainer documentContainer, DocTemplates docTemplates) {
 		super(ureq, wControl);
 		this.documentContainer = documentContainer;
-		this.fileTypes = fileTypes.getFileTypes();
+		this.templates = docTemplates.getTemplates();
 		initForm(ureq);
 	}
 
@@ -75,21 +75,21 @@ public class NewSolutionController extends FormBasicController {
 		titleEl.setElementCssClass("o_sel_course_gta_upload_task_title");
 		titleEl.setMandatory(true);
 		
-		String[] fileTypeKeys = new String[fileTypes.size()];
-		String[] fileTypeValues = new String[fileTypes.size()];
-		String[] fileTypeSuffix = new String[fileTypes.size()];
-		for (int i = 0; i < fileTypes.size(); i++) {
-			FileType fileType = fileTypes.get(i);
-			String name = fileType.getName() + " (." + fileType.getSuffix() + ")";
+		String[] fileTypeKeys = new String[templates.size()];
+		String[] fileTypeValues = new String[templates.size()];
+		String[] fileTypeSuffix = new String[templates.size()];
+		for (int i = 0; i < templates.size(); i++) {
+			DocTemplate docTemplate = templates.get(i);
+			String name = docTemplate.getName() + " (." + docTemplate.getSuffix() + ")";
 			fileTypeKeys[i] = String.valueOf(i);
 			fileTypeValues[i] = name;
-			fileTypeSuffix[i] = fileType.getSuffix();
+			fileTypeSuffix[i] = docTemplate.getSuffix();
 		}
-		fileTypeEl = uifactory.addDropdownSingleselect("file.type", formLayout, fileTypeKeys, fileTypeValues, fileTypeSuffix);
-		fileTypeEl.setElementCssClass("o_sel_course_gta_doc_filetype");
-		fileTypeEl.setMandatory(true);
-		if (fileTypes.size() == 1) {
-			fileTypeEl.setVisible(false);
+		docTypeEl = uifactory.addDropdownSingleselect("file.type", formLayout, fileTypeKeys, fileTypeValues, fileTypeSuffix);
+		docTypeEl.setElementCssClass("o_sel_course_gta_doc_filetype");
+		docTypeEl.setMandatory(true);
+		if (templates.size() == 1) {
+			docTypeEl.setVisible(false);
 		}
 
 		filenameEl = uifactory.addTextElement("fileName", "file.name", -1, "", formLayout);
@@ -106,8 +106,8 @@ public class NewSolutionController extends FormBasicController {
 		String jsPage = velocity_root + "/new_task_js.html";
 		FormLayoutContainer jsCont = FormLayoutContainer.createCustomFormLayout("js", getTranslator(), jsPage);
 		jsCont.contextPut("titleId", titleEl.getFormDispatchId());
-		jsCont.contextPut("filetypeId", fileTypeEl.getFormDispatchId());
-		jsCont.contextPut("filetypeDefaultSuffix", fileTypes.get(0).getSuffix());
+		jsCont.contextPut("filetypeId", docTypeEl.getFormDispatchId());
+		jsCont.contextPut("filetypeDefaultSuffix", templates.get(0).getSuffix());
 		jsCont.contextPut("filenameId", filenameEl.getFormDispatchId());
 		formLayout.add(jsCont);
 	}
@@ -119,16 +119,16 @@ public class NewSolutionController extends FormBasicController {
 	
 	private String getFilename() {
 		String fileName = filenameEl.getValue().toLowerCase();
-		FileType fileType = getSelectedFileType();
-		String suffix = fileType != null? fileType.getSuffix(): "";
+		DocTemplate docTemplate = getSelectedTemplate();
+		String suffix = docTemplate != null? docTemplate.getSuffix(): "";
 		return fileName.endsWith("." + suffix)
 				? fileName
 				: fileName + "." + suffix;
 	}
 
-	private FileType getSelectedFileType() {
-		int index = fileTypeEl.getSelected();
-		return index >= 0? fileTypes.get(index): fileTypes.get(0);
+	private DocTemplate getSelectedTemplate() {
+		int index = docTypeEl.getSelected();
+		return index >= 0? templates.get(index): templates.get(0);
 	}
 	
 	public Solution getSolution() {
@@ -178,9 +178,9 @@ public class NewSolutionController extends FormBasicController {
 			documentName = VFSManager.rename(documentContainer, documentName);
 			vfsLeaf = documentContainer.createChildLeaf(documentName);
 		}
-		FileType fileType = getSelectedFileType();
-		if (fileType != null) {
-			VFSManager.copyContent(fileType.getContentProvider().getContent(), vfsLeaf);
+		DocTemplate docTemplate = getSelectedTemplate();
+		if (docTemplate != null) {
+			VFSManager.copyContent(docTemplate.getContentProvider().getContent(), vfsLeaf);
 		}
 		if(vfsLeaf.canMeta() == VFSConstants.YES) {
 			VFSMetadata metaInfo = vfsLeaf.getMetaInfo();
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/NewTaskController.java b/src/main/java/org/olat/course/nodes/gta/ui/NewTaskController.java
index e92693db558..cde3c166abd 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/NewTaskController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/NewTaskController.java
@@ -21,8 +21,8 @@ package org.olat.course.nodes.gta.ui;
 
 import java.util.List;
 
-import org.olat.core.commons.services.filetemplate.FileType;
-import org.olat.core.commons.services.filetemplate.FileTypes;
+import org.olat.core.commons.services.doceditor.DocTemplate;
+import org.olat.core.commons.services.doceditor.DocTemplates;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
@@ -49,15 +49,15 @@ import org.olat.course.nodes.gta.model.TaskDefinition;
 public class NewTaskController extends FormBasicController {
 	
 	private TextElement filenameEl, titleEl, descriptionEl;
-	private SingleSelection fileTypeEl;
+	private SingleSelection docTypeEl;
 	private final VFSContainer documentContainer;
-	private final List<FileType> fileTypes;
+	private final List<DocTemplate> templates;
 	
 	public NewTaskController(UserRequest ureq, WindowControl wControl, VFSContainer documentContainer,
-			FileTypes fileTypes) {
+			DocTemplates docTemplates) {
 		super(ureq, wControl);
 		this.documentContainer = documentContainer;
-		this.fileTypes = fileTypes.getFileTypes();
+		this.templates = docTemplates.getTemplates();
 		initForm(ureq);
 	}
 
@@ -71,21 +71,21 @@ public class NewTaskController extends FormBasicController {
 		
 		descriptionEl = uifactory.addTextAreaElement("descr", "task.description", 2048, 10, -1, true, false, "", formLayout);
 
-		String[] fileTypeKeys = new String[fileTypes.size()];
-		String[] fileTypeValues = new String[fileTypes.size()];
-		String[] fileTypeSuffix = new String[fileTypes.size()];
-		for (int i = 0; i < fileTypes.size(); i++) {
-			FileType fileType = fileTypes.get(i);
-			String name = fileType.getName() + " (." + fileType.getSuffix() + ")";
+		String[] fileTypeKeys = new String[templates.size()];
+		String[] fileTypeValues = new String[templates.size()];
+		String[] fileTypeSuffix = new String[templates.size()];
+		for (int i = 0; i < templates.size(); i++) {
+			DocTemplate docTemplate = templates.get(i);
+			String name = docTemplate.getName() + " (." + docTemplate.getSuffix() + ")";
 			fileTypeKeys[i] = String.valueOf(i);
 			fileTypeValues[i] = name;
-			fileTypeSuffix[i] = fileType.getSuffix();
+			fileTypeSuffix[i] = docTemplate.getSuffix();
 		}
-		fileTypeEl = uifactory.addDropdownSingleselect("file.type", formLayout, fileTypeKeys, fileTypeValues, fileTypeSuffix);
-		fileTypeEl.setElementCssClass("o_sel_course_gta_doc_filetype");
-		fileTypeEl.setMandatory(true);
-		if (fileTypes.size() == 1) {
-			fileTypeEl.setVisible(false);
+		docTypeEl = uifactory.addDropdownSingleselect("file.type", formLayout, fileTypeKeys, fileTypeValues, fileTypeSuffix);
+		docTypeEl.setElementCssClass("o_sel_course_gta_doc_filetype");
+		docTypeEl.setMandatory(true);
+		if (templates.size() == 1) {
+			docTypeEl.setVisible(false);
 		}
 		
 		filenameEl = uifactory.addTextElement("fileName", "file.name", -1, "", formLayout);
@@ -102,8 +102,8 @@ public class NewTaskController extends FormBasicController {
 		String jsPage = velocity_root + "/new_task_js.html";
 		FormLayoutContainer jsCont = FormLayoutContainer.createCustomFormLayout("js", getTranslator(), jsPage);
 		jsCont.contextPut("titleId", titleEl.getFormDispatchId());
-		jsCont.contextPut("filetypeId", fileTypeEl.getFormDispatchId());
-		jsCont.contextPut("filetypeDefaultSuffix", fileTypes.get(0).getSuffix());
+		jsCont.contextPut("filetypeId", docTypeEl.getFormDispatchId());
+		jsCont.contextPut("filetypeDefaultSuffix", templates.get(0).getSuffix());
 		jsCont.contextPut("filenameId", filenameEl.getFormDispatchId());
 		formLayout.add(jsCont);
 	}
@@ -115,16 +115,16 @@ public class NewTaskController extends FormBasicController {
 	
 	private String getFilename() {
 		String fileName = filenameEl.getValue().toLowerCase();
-		FileType fileType = getSelectedFileType();
-		String suffix = fileType != null? fileType.getSuffix(): "";
+		DocTemplate docTemplate = getSelectedTemplate();
+		String suffix = docTemplate != null? docTemplate.getSuffix(): "";
 		return fileName.endsWith("." + suffix)
 				? fileName
 				: fileName + "." + suffix;
 	}
 
-	private FileType getSelectedFileType() {
-		int index = fileTypeEl.getSelected();
-		return index >= 0? fileTypes.get(index): fileTypes.get(0);
+	private DocTemplate getSelectedTemplate() {
+		int index = docTypeEl.getSelected();
+		return index >= 0? templates.get(index): templates.get(0);
 	}
 	
 	public TaskDefinition getTaskDefinition() {
@@ -175,9 +175,9 @@ public class NewTaskController extends FormBasicController {
 			documentName = VFSManager.rename(documentContainer, documentName);
 			vfsLeaf = documentContainer.createChildLeaf(documentName);
 		}
-		FileType fileType = getSelectedFileType();
-		if (fileType != null) {
-			VFSManager.copyContent(fileType.getContentProvider().getContent(), vfsLeaf);
+		DocTemplate docTemplate = getSelectedTemplate();
+		if (docTemplate != null) {
+			VFSManager.copyContent(docTemplate.getContentProvider().getContent(), vfsLeaf);
 		}
 		fireEvent(ureq, Event.DONE_EVENT);
 	}
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/SolutionRow.java b/src/main/java/org/olat/course/nodes/gta/ui/SolutionRow.java
index 068aacdb9cb..abceb9e441f 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/SolutionRow.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/SolutionRow.java
@@ -19,7 +19,7 @@
  */
 package org.olat.course.nodes.gta.ui;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
 import org.olat.core.gui.components.form.flexible.elements.DownloadLink;
 import org.olat.course.nodes.gta.model.Solution;
 
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java b/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java
index 116aec060cc..be6fa0afc10 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java
@@ -19,7 +19,8 @@
  */
 package org.olat.course.nodes.gta.ui;
 
-import static org.olat.core.commons.services.vfs.VFSLeafEditor.Mode.EDIT;
+import static org.olat.core.commons.services.doceditor.DocEditor.Mode.EDIT;
+import static org.olat.course.nodes.gta.ui.GTAUIFactory.getOpenMode;
 import static org.olat.course.nodes.gta.ui.GTAUIFactory.htmlOffice;
 
 import java.io.File;
@@ -33,13 +34,13 @@ import java.util.Date;
 import java.util.List;
 
 import org.olat.core.commons.modules.singlepage.SinglePageController;
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
-import org.olat.core.commons.services.vfs.VFSLeafEditorConfigs;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallbackBuilder;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallbackBuilder;
+import org.olat.core.commons.services.doceditor.ui.DocEditorFullscreenController;
 import org.olat.core.commons.services.vfs.VFSMetadata;
 import org.olat.core.commons.services.vfs.VFSRepositoryService;
-import org.olat.core.commons.services.vfs.ui.editor.VFSLeafEditorFullscreenController;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
@@ -92,7 +93,7 @@ class SubmitDocumentsController extends FormBasicController {
 	private DocumentUploadController uploadCtrl, replaceCtrl;
 	private DialogBoxController confirmDeleteCtrl;
 	private SinglePageController viewDocCtrl;
-	private VFSLeafEditorFullscreenController vfsLeafEditorCtrl;
+	private DocEditorFullscreenController docEditorCtrl;
 	
 	private final int maxDocs;
 	private final String docI18nKey;
@@ -112,7 +113,7 @@ class SubmitDocumentsController extends FormBasicController {
 	@Autowired
 	private UserManager userManager;
 	@Autowired
-	private VFSRepositoryService vfsService;
+	private VFSRepositoryService vfsRepositoryService;
 	
 	public SubmitDocumentsController(UserRequest ureq, WindowControl wControl, Task assignedTask,
 			File documentsDir, VFSContainer documentsContainer, int maxDocs, GTACourseNode cNode,
@@ -210,7 +211,7 @@ class SubmitDocumentsController extends FormBasicController {
 			
 			if(item instanceof VFSLeaf) {
 				VFSLeaf vfsLeaf = (VFSLeaf)item;
-				openMode = getOpenMode(vfsLeaf);
+				openMode = getOpenMode(vfsLeaf, getIdentity(), readOnly);
 			}
 			docList.add(new SubmittedSolution(document, uploadedBy, download, openMode));
 		}
@@ -239,15 +240,6 @@ class SubmitDocumentsController extends FormBasicController {
 		flc.contextPut("hasDocuments", Boolean.valueOf(hasUploadDocuments()));
 	}
 	
-	private Mode getOpenMode(VFSLeaf vfsLeaf) {
-		if (!readOnly && vfsService.hasEditor(vfsLeaf, Mode.EDIT, getIdentity())) {
-			return Mode.EDIT;
-		} else if (vfsService.hasEditor(vfsLeaf, Mode.VIEW, getIdentity())) {
-			return Mode.VIEW;
-		}
-		return null;
-	}
-	
 	@Override
 	protected void doDispose() {
 		//
@@ -298,9 +290,9 @@ class SubmitDocumentsController extends FormBasicController {
 				updateModel();
 			} 
 			checkDeadline(ureq);
-		} else if (source == vfsLeafEditorCtrl) {
+		} else if (source == docEditorCtrl) {
 			if(event == Event.DONE_EVENT) {
-				fireEvent(ureq, new SubmitEvent(SubmitEvent.UPDATE, vfsLeafEditorCtrl.getVfsLeaf().getName()));
+				fireEvent(ureq, new SubmitEvent(SubmitEvent.UPDATE, docEditorCtrl.getVfsLeaf().getName()));
 				gtaManager.markNews(courseEnv, gtaNode);
 			}
 			updateModel();
@@ -314,13 +306,13 @@ class SubmitDocumentsController extends FormBasicController {
 	
 	private void cleanUp() {
 		removeAsListenerAndDispose(confirmDeleteCtrl);
-		removeAsListenerAndDispose(vfsLeafEditorCtrl);
+		removeAsListenerAndDispose(docEditorCtrl);
 		removeAsListenerAndDispose(viewDocCtrl);
 		removeAsListenerAndDispose(uploadCtrl);
 		removeAsListenerAndDispose(newDocCtrl);
 		removeAsListenerAndDispose(cmc);
 		confirmDeleteCtrl = null;
-		vfsLeafEditorCtrl = null;
+		docEditorCtrl = null;
 		viewDocCtrl = null;
 		uploadCtrl = null;
 		newDocCtrl = null;
@@ -410,12 +402,12 @@ class SubmitDocumentsController extends FormBasicController {
 		if(vfsItem == null || !(vfsItem instanceof VFSLeaf)) {
 			showError("error.missing.file");
 		} else {
-			VFSLeafEditorSecurityCallback secCallback = VFSLeafEditorSecurityCallbackBuilder.builder()
+			DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder()
 					.withMode(mode)
 					.build();
-			VFSLeafEditorConfigs configs = GTAUIFactory.getEditorConfig(documentsContainer, filename, null);
-			vfsLeafEditorCtrl = new VFSLeafEditorFullscreenController(ureq, getWindowControl(), (VFSLeaf)vfsItem, secCallback, configs);
-			listenTo(vfsLeafEditorCtrl);
+			DocEditorConfigs configs = GTAUIFactory.getEditorConfig(documentsContainer, filename, null);
+			docEditorCtrl = new DocEditorFullscreenController(ureq, getWindowControl(), (VFSLeaf)vfsItem, secCallback, configs);
+			listenTo(docEditorCtrl);
 		}
 	}
 	
@@ -446,7 +438,7 @@ class SubmitDocumentsController extends FormBasicController {
 			if(downloadedFile != null && downloadedFile.canMeta() == VFSConstants.YES) {
 				VFSMetadata  metadata = downloadedFile.getMetaInfo();
 				metadata.setAuthor(ureq.getIdentity());
-				vfsService.updateMetadata(metadata);
+				vfsRepositoryService.updateMetadata(metadata);
 			}
 		} catch (IOException e) {
 			logError("", e);
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/TaskDefinitionRow.java b/src/main/java/org/olat/course/nodes/gta/ui/TaskDefinitionRow.java
index 77322e729a2..98bf1a4c7cf 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/TaskDefinitionRow.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/TaskDefinitionRow.java
@@ -19,7 +19,7 @@
  */
 package org.olat.course.nodes.gta.ui;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
 import org.olat.core.gui.components.form.flexible.elements.DownloadLink;
 import org.olat.course.nodes.gta.model.TaskDefinition;
 
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/component/ModeCellRenderer.java b/src/main/java/org/olat/course/nodes/gta/ui/component/ModeCellRenderer.java
index cef42b462e4..d61dfa2e85f 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/component/ModeCellRenderer.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/component/ModeCellRenderer.java
@@ -19,7 +19,7 @@
  */
 package org.olat.course.nodes.gta.ui.component;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiCellRenderer;
 import org.olat.core.gui.render.Renderer;
diff --git a/src/main/java/org/olat/modules/_spring/modulesContext.xml b/src/main/java/org/olat/modules/_spring/modulesContext.xml
index e1683dd5770..52bf9496038 100644
--- a/src/main/java/org/olat/modules/_spring/modulesContext.xml
+++ b/src/main/java/org/olat/modules/_spring/modulesContext.xml
@@ -102,26 +102,6 @@
 		</property>
 	</bean>	
 	
-	<!-- Collabora admin. panel -->
-	<bean class="org.olat.core.extensions.action.GenericActionExtension" init-method="initExtensionPoints">
-		<property name="order" value="8256" />
-		<property name="actionController">	
-			<bean class="org.olat.core.gui.control.creator.AutoCreator" scope="prototype">
-				<property name="className" value="org.olat.modules.wopi.collabora.ui.CollaboraAdminController"/>
-			</bean>
-		</property>
-		<property name="navigationKey" value="collabora" />
-		<property name="i18nActionKey" value="admin.menu.title"/>
-		<property name="i18nDescriptionKey" value="admin.menu.title.alt"/>
-		<property name="translationPackage" value="org.olat.modules.wopi.collabora.ui"/>
-		<property name="parentTreeNodeIdentifier" value="externalToolsParent" /> 
-		<property name="extensionPoints">
-			<list>	
-				<value>org.olat.admin.SystemAdminMainController</value>		
-			</list>
-		</property>
-	</bean>
-	
 	<!-- Goto admin. panel -->
 	<bean class="org.olat.core.extensions.action.GenericActionExtension" init-method="initExtensionPoints">
 		<property name="order" value="8218" />
diff --git a/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java b/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java
index b4e151a4138..4053153fe37 100644
--- a/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java
+++ b/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java
@@ -19,14 +19,14 @@
  */
 package org.olat.modules.portfolio.handler;
 
-import static org.olat.core.commons.services.vfs.VFSLeafEditor.Mode.EDIT;
+import static org.olat.core.commons.services.doceditor.DocEditor.Mode.EDIT;
 
 import java.util.Locale;
 
 import org.olat.core.CoreSpringFactory;
-import org.olat.core.commons.services.filetemplate.FileTypes;
-import org.olat.core.commons.services.filetemplate.FileTypes.Builder;
-import org.olat.core.commons.services.vfs.VFSRepositoryService;
+import org.olat.core.commons.services.doceditor.DocTemplates;
+import org.olat.core.commons.services.doceditor.DocumentEditorService;
+import org.olat.core.commons.services.doceditor.DocTemplates.Builder;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.modules.ceditor.PageElementAddController;
@@ -40,16 +40,16 @@ import org.olat.modules.portfolio.ui.media.CreateFileMediaController;
  */
 public class CreateFileHandler extends FileHandler {
 	
-	public static FileTypes getEditableFileTypes(Locale locale) {
-		VFSRepositoryService vfsService = CoreSpringFactory.getImpl(VFSRepositoryService.class);
-		Builder builder = FileTypes.builder(locale);
-		if (vfsService.hasEditor("docx", EDIT)) {
+	public static DocTemplates getEditableTemplates(Locale locale) {
+		DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class);
+		Builder builder = DocTemplates.builder(locale);
+		if (docEditorService.hasEditor("docx", EDIT)) {
 			builder.addDocx();
 		}
-		if (vfsService.hasEditor("xlsx", EDIT)) {
+		if (docEditorService.hasEditor("xlsx", EDIT)) {
 			builder.addXlsx();
 		}
-		if (vfsService.hasEditor("pptx", EDIT)) {
+		if (docEditorService.hasEditor("pptx", EDIT)) {
 			builder.addPptx();
 		}
 		return builder.build();
@@ -62,7 +62,7 @@ public class CreateFileHandler extends FileHandler {
 	
 	@Override
 	public PageElementAddController getAddPageElementController(UserRequest ureq, WindowControl wControl) {
-		return new CreateFileMediaController(ureq, wControl, getEditableFileTypes(ureq.getLocale()));
+		return new CreateFileMediaController(ureq, wControl, getEditableTemplates(ureq.getLocale()));
 	}
 
 }
diff --git a/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java b/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java
index fec26f774bb..fbdf57e61ac 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java
@@ -29,7 +29,7 @@ import java.util.stream.Collectors;
 import javax.servlet.http.HttpServletRequest;
 
 import org.olat.core.commons.persistence.SortKey;
-import org.olat.core.commons.services.filetemplate.FileTypes;
+import org.olat.core.commons.services.doceditor.DocTemplates;
 import org.olat.core.commons.services.image.Size;
 import org.olat.core.dispatcher.mapper.Mapper;
 import org.olat.core.gui.UserRequest;
@@ -117,7 +117,7 @@ public class MediaCenterController extends FormBasicController
 	
 	private int counter = 0;
 	private final boolean select;
-	private final FileTypes editableFileTypes;
+	private final DocTemplates editableFileTypes;
 	private List<FormLink> tagLinks;
 	private final TooledStackedPanel stackPanel;
 
@@ -144,7 +144,7 @@ public class MediaCenterController extends FormBasicController
 		super(ureq, wControl, "medias");
 		this.stackPanel = null;
 		this.select = true;
-		this.editableFileTypes = CreateFileHandler.getEditableFileTypes(getLocale());
+		this.editableFileTypes = CreateFileHandler.getEditableTemplates(getLocale());
 		 
 		initForm(ureq);
 		loadModel();
@@ -154,7 +154,7 @@ public class MediaCenterController extends FormBasicController
 		super(ureq, wControl, "medias");
 		this.stackPanel = stackPanel;
 		this.select = false;
-		this.editableFileTypes = CreateFileHandler.getEditableFileTypes(getLocale());
+		this.editableFileTypes = CreateFileHandler.getEditableTemplates(getLocale());
 		 
 		initForm(ureq);
 		loadModel();
diff --git a/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java b/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java
index cb943ed8384..39325491296 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java
@@ -27,10 +27,10 @@ import org.olat.core.commons.fullWebApp.popup.BaseFullWebappPopupLayoutFactory;
 import org.olat.core.commons.services.commentAndRating.CommentAndRatingDefaultSecurityCallback;
 import org.olat.core.commons.services.commentAndRating.CommentAndRatingSecurityCallback;
 import org.olat.core.commons.services.commentAndRating.ui.UserCommentsAndRatingsController;
-import org.olat.core.commons.services.filetemplate.FileType;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocTemplate;
+import org.olat.core.commons.services.doceditor.DocumentEditorService;
 import org.olat.core.commons.services.pdf.PdfModule;
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
-import org.olat.core.commons.services.vfs.VFSRepositoryService;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.dropdown.Dropdown;
@@ -158,7 +158,7 @@ public class PageRunController extends BasicController implements TooledControll
 	@Autowired
 	private PortfolioService portfolioService;
 	@Autowired
-	private VFSRepositoryService vfsRepositoryService;
+	private DocumentEditorService vfsRepositoryService;
 	
 	public PageRunController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel,
 			BinderSecurityCallback secCallback, Page page, boolean openEditMode) {
@@ -804,9 +804,9 @@ public class PageRunController extends BasicController implements TooledControll
 		}
 
 		private boolean isCreateFilePossible() {
-			List<FileType> editableFileTypes = CreateFileHandler.getEditableFileTypes(getLocale()).getFileTypes();
-			for (FileType fileType: editableFileTypes) {
-				if (vfsRepositoryService.hasEditor(fileType.getSuffix(), Mode.EDIT)) {
+			List<DocTemplate> editableTemplates = CreateFileHandler.getEditableTemplates(getLocale()).getTemplates();
+			for (DocTemplate docTemplate: editableTemplates) {
+				if (vfsRepositoryService.hasEditor(docTemplate.getSuffix(), Mode.EDIT)) {
 					return true;
 				}
 			}
diff --git a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties
index 6d05d98a23c..f47caa704c9 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_de.properties
@@ -118,10 +118,10 @@ create.empty.binder=Leere Mappe erstellen
 create.empty.binder.from.course=Mappe f\u00FCr Portfolioaufgabe aus Kurs erstellen
 create.empty.binder.from.template=Mappe basierend auf Vorlage erstellen
 create.file=Erstellen
-create.file.name=$org.olat.core.commons.services.filetemplate.ui\:create.file.name
-create.file.name.notvalid=$org.olat.core.commons.services.filetemplate.ui\:create.file.name.notvalid
+create.file.name=$org.olat.core.commons.services.doceditor.ui\:create.doc.name
+create.file.name.notvalid=$org.olat.core.commons.services.doceditor.ui\:create.file.doc.notvalid
 create.file.title=Dokument erstellen
-create.file.type=$org.olat.core.commons.services.filetemplate.ui\:create.file.type
+create.file.type=$org.olat.core.commons.services.doceditor.ui\:create.doc.type
 create.new.assignment=Neue Aufgabe
 create.new.assignment.descr=Neue Aufgabe erlaubt ...
 create.new.assignment.title=Neue Aufgabe erstellen
diff --git a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties
index 27f73e5358d..505fbf5aefc 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/portfolio/ui/_i18n/LocalStrings_en.properties
@@ -118,10 +118,10 @@ create.empty.binder=New empty binder
 create.empty.binder.from.course=New binder from course portfolio task
 create.empty.binder.from.template=New binder from template
 create.file=Create
-create.file.name=$org.olat.core.commons.services.filetemplate.ui\:create.file.name
-create.file.name.notvalid=$org.olat.core.commons.services.filetemplate.ui\:create.file.name.notvalid
+create.file.name=$org.olat.core.commons.services.doceditor.ui\:create.doc.name
+create.file.name.notvalid=$org.olat.core.commons.services.doceditor.ui\:create.doc.name.notvalid
 create.file.title=Create document
-create.file.type=$org.olat.core.commons.services.filetemplate.ui\:create.file.type
+create.file.type=$org.olat.core.commons.services.doceditor.ui\:create.doc.type
 create.new.assignment=New assignment
 create.new.assignment.descr=Create a new assignment to assign something to someone
 create.new.assignment.title=Create a new assignment
diff --git a/src/main/java/org/olat/modules/portfolio/ui/media/CreateFileMediaController.java b/src/main/java/org/olat/modules/portfolio/ui/media/CreateFileMediaController.java
index 7dcb9cb28d9..ee008bac7b9 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/media/CreateFileMediaController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/media/CreateFileMediaController.java
@@ -28,8 +28,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import org.olat.core.commons.services.filetemplate.FileType;
-import org.olat.core.commons.services.filetemplate.FileTypes;
+import org.olat.core.commons.services.doceditor.DocTemplate;
+import org.olat.core.commons.services.doceditor.DocTemplates;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.RichTextElement;
@@ -78,7 +78,7 @@ public class CreateFileMediaController extends FormBasicController implements Pa
 	private Media mediaReference;
 	private Map<String,String> categories = new HashMap<>();
 	
-	private final List<FileType> fileTypes;
+	private final List<DocTemplate> docTemplates;
 	private final String businessPath;
 	private AddElementInfos userObject;
 	
@@ -87,9 +87,9 @@ public class CreateFileMediaController extends FormBasicController implements Pa
 	@Autowired
 	private PortfolioService portfolioService;
 
-	public CreateFileMediaController(UserRequest ureq, WindowControl wControl, FileTypes fileTypes) {
+	public CreateFileMediaController(UserRequest ureq, WindowControl wControl, DocTemplates docTemplates) {
 		super(ureq, wControl);
-		this.fileTypes = fileTypes.getFileTypes();
+		this.docTemplates = docTemplates.getTemplates();
 		setTranslator(Util.createPackageTranslator(PortfolioHomeController.class, getLocale(), getTranslator()));
 		businessPath = "[HomeSite:" + getIdentity().getKey() + "][PortfolioV2:0][MediaCenter:0]";
 		initForm(ureq);
@@ -129,9 +129,9 @@ public class CreateFileMediaController extends FormBasicController implements Pa
 		descriptionEl.getEditorConfiguration().setPathInStatusBar(false);
 		
 		KeyValues fileTypeKV = new KeyValues();
-		for (int i = 0; i < fileTypes.size(); i++) {
-			FileType fileType = fileTypes.get(i);
-			String name = fileType.getName() + " (." + fileType.getSuffix() + ")";
+		for (int i = 0; i < docTemplates.size(); i++) {
+			DocTemplate docTemplate = docTemplates.get(i);
+			String name = docTemplate.getName() + " (." + docTemplate.getSuffix() + ")";
 			fileTypeKV.add(entry(String.valueOf(i), name));
 		}
 		fileTypeEl = uifactory.addDropdownSingleselect("create.file.type", formLayout, fileTypeKV.keys(), fileTypeKV.values());
@@ -199,16 +199,16 @@ public class CreateFileMediaController extends FormBasicController implements Pa
 	
 	private String getFileName() {
 		String fileName = fileNameEl.getValue();
-		FileType fileType = getSelectedFileType();
-		String suffix = fileType != null? fileType.getSuffix(): "";
+		DocTemplate docTemplate = getSelectedFileType();
+		String suffix = docTemplate != null? docTemplate.getSuffix(): "";
 		return fileName.endsWith("." + suffix)
 				? fileName
 				: fileName + "." + suffix;
 	}
 
-	private FileType getSelectedFileType() {
+	private DocTemplate getSelectedFileType() {
 		int index = fileTypeEl.getSelected();
-		return index > -1? fileTypes.get(index): null;
+		return index > -1? docTemplates.get(index): null;
 	}
 
 	@Override
@@ -235,9 +235,9 @@ public class CreateFileMediaController extends FormBasicController implements Pa
 
 	private void createContent(File file) {
 		VFSLeaf vfsLeaf = new LocalFileImpl(file);
-		FileType fileType = getSelectedFileType();
-		if (fileType != null) {
-			VFSManager.copyContent(fileType.getContentProvider().getContent(), vfsLeaf);
+		DocTemplate docTemplate = getSelectedFileType();
+		if (docTemplate != null) {
+			VFSManager.copyContent(docTemplate.getContentProvider().getContent(), vfsLeaf);
 		}
 	}
 
diff --git a/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java b/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java
index 06183c6e498..fb492c9f32a 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java
@@ -22,12 +22,12 @@ package org.olat.modules.portfolio.ui.media;
 import java.util.Arrays;
 import java.util.List;
 
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
-import org.olat.core.commons.services.vfs.VFSLeafEditorConfigs;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallbackBuilder;
-import org.olat.core.commons.services.vfs.VFSRepositoryService;
-import org.olat.core.commons.services.vfs.ui.editor.VFSLeafEditorFullscreenController;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocEditorConfigs;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallbackBuilder;
+import org.olat.core.commons.services.doceditor.DocumentEditorService;
+import org.olat.core.commons.services.doceditor.ui.DocEditorFullscreenController;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
@@ -70,7 +70,7 @@ public class FileMediaController extends BasicController implements PageElementE
 	private VelocityContainer mainVC;
 	private Link editLink;
 
-	private VFSLeafEditorFullscreenController vfsLeafEditorCtrl;
+	private DocEditorFullscreenController docEditorCtrl;
 
 	private final Media media;
 	private final MediaRenderingHints hints;
@@ -83,7 +83,8 @@ public class FileMediaController extends BasicController implements PageElementE
 	@Autowired
 	private UserManager userManager;
 	@Autowired
-	private VFSRepositoryService vfsService;
+	private DocumentEditorService docEditorService;
+	
 	public FileMediaController(UserRequest ureq, WindowControl wControl, Media media, MediaRenderingHints hints) {
 		super(ureq, wControl);
 		this.media = media;
@@ -140,7 +141,7 @@ public class FileMediaController extends BasicController implements PageElementE
 		
 		if (vfsLeaf != null && !hints.isToPdf()) {
 			Mode mode = getOpenMode();
-			if (vfsService.hasEditor(vfsLeaf, mode, getIdentity())) {
+			if (docEditorService.hasEditor(vfsLeaf, mode, getIdentity())) {
 				editLink = LinkFactory.createCustomLink("edit", "edit", "", Link.NONTRANSLATED | Link.LINK, mainVC,
 						this);
 				String editIcon = Mode.EDIT.equals(mode)? "o_icon_edit": "o_icon_preview";
@@ -164,9 +165,9 @@ public class FileMediaController extends BasicController implements PageElementE
 	private Mode getOpenMode() {
 		if (isEditingExcluded()) {
 			return null;
-		} else if (editMode && vfsService.hasEditor(vfsLeaf, Mode.EDIT, getIdentity())) {
+		} else if (editMode && docEditorService.hasEditor(vfsLeaf, Mode.EDIT, getIdentity())) {
 			return Mode.EDIT;
-		} else if (vfsService.hasEditor(vfsLeaf, Mode.VIEW, getIdentity())) {
+		} else if (docEditorService.hasEditor(vfsLeaf, Mode.VIEW, getIdentity())) {
 			return Mode.VIEW;
 		}
 		return null;
@@ -187,7 +188,7 @@ public class FileMediaController extends BasicController implements PageElementE
 
 	@Override
 	protected void event(UserRequest ureq, Controller source, Event event) {
-		if (source == vfsLeafEditorCtrl) {
+		if (source == docEditorCtrl) {
 			if(event == Event.DONE_EVENT) {
 				cleanUp();
 			}
@@ -196,8 +197,8 @@ public class FileMediaController extends BasicController implements PageElementE
 	}
 	
 	private void cleanUp() {
-		removeAsListenerAndDispose(vfsLeafEditorCtrl);
-		vfsLeafEditorCtrl = null;
+		removeAsListenerAndDispose(docEditorCtrl);
+		docEditorCtrl = null;
 	}
 
 	private void doOpen(UserRequest ureq, Mode mode) {
@@ -206,12 +207,12 @@ public class FileMediaController extends BasicController implements PageElementE
 		if(vfsItem == null || !(vfsItem instanceof VFSLeaf)) {
 			showError("error.missing.file");
 		} else {
-			VFSLeafEditorSecurityCallback secCallback = VFSLeafEditorSecurityCallbackBuilder.builder()
+			DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder()
 					.withMode(mode)
 					.build();
-			VFSLeafEditorConfigs configs = VFSLeafEditorConfigs.builder().build();
-			vfsLeafEditorCtrl = new VFSLeafEditorFullscreenController(ureq, getWindowControl(), (VFSLeaf)vfsItem, secCallback, configs);
-			listenTo(vfsLeafEditorCtrl);
+			DocEditorConfigs configs = DocEditorConfigs.builder().build();
+			docEditorCtrl = new DocEditorFullscreenController(ureq, getWindowControl(), (VFSLeaf)vfsItem, secCallback, configs);
+			listenTo(docEditorCtrl);
 		}
 	}
 
diff --git a/src/main/java/org/olat/repository/handlers/VFSEditorDelegate.java b/src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java
similarity index 79%
rename from src/main/java/org/olat/repository/handlers/VFSEditorDelegate.java
rename to src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java
index f5bf258ef30..fb0553ae964 100644
--- a/src/main/java/org/olat/repository/handlers/VFSEditorDelegate.java
+++ b/src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java
@@ -19,18 +19,18 @@
  */
 package org.olat.repository.handlers;
 
-import static org.olat.core.commons.services.vfs.VFSLeafEditorConfigs.none;
+import static org.olat.core.commons.services.doceditor.DocEditorConfigs.none;
 
 import java.io.File;
 import java.util.Locale;
 
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.DBFactory;
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallbackBuilder;
-import org.olat.core.commons.services.vfs.VFSRepositoryService;
-import org.olat.core.commons.services.vfs.ui.editor.VFSLeafEditorController;
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallbackBuilder;
+import org.olat.core.commons.services.doceditor.DocumentEditorService;
+import org.olat.core.commons.services.doceditor.ui.DocEditorController;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.stack.TooledStackedPanel;
 import org.olat.core.gui.control.Controller;
@@ -59,11 +59,11 @@ import org.olat.resource.OLATResourceManager;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class VFSEditorDelegate implements WebDocumentCreateDelegate, WebDocumentEditDelegate {
+public class DocumentEditorDelegate implements WebDocumentCreateDelegate, WebDocumentEditDelegate {
 
-	private VFSEditorDelegateType type;
+	private DocumentEditorDelegateType type;
 
-	public VFSEditorDelegate(VFSEditorDelegateType type) {
+	public DocumentEditorDelegate(DocumentEditorDelegateType type) {
 		this.type = type;
 	}
 	
@@ -78,8 +78,8 @@ public class VFSEditorDelegate implements WebDocumentCreateDelegate, WebDocument
 	}
 
 	private boolean canEdit() {
-		VFSRepositoryService vfsService = CoreSpringFactory.getImpl(VFSRepositoryService.class);
-		return vfsService.hasEditor(type.getSuffix(), Mode.EDIT);
+		DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class);
+		return docEditorService.hasEditor(type.getSuffix(), Mode.EDIT);
 	}
 	
 	@Override
@@ -121,11 +121,11 @@ public class VFSEditorDelegate implements WebDocumentCreateDelegate, WebDocument
 			throw new AssertException("Web document not found! " + re);
 		}
 		
-		VFSLeafEditorSecurityCallback secCallback = VFSLeafEditorSecurityCallbackBuilder.builder()
+		DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder()
 				.withMode(Mode.EDIT)
 				.canClose(false)
 				.build();
-		return new VFSLeafEditorController(ureq, wControl, document, secCallback, none(), "o_web_document_edit");
+		return new DocEditorController(ureq, wControl, document, secCallback, none(), "o_web_document_edit");
 	}
 	
 }
diff --git a/src/main/java/org/olat/repository/handlers/VFSEditorDelegateType.java b/src/main/java/org/olat/repository/handlers/DocumentEditorDelegateType.java
similarity index 96%
rename from src/main/java/org/olat/repository/handlers/VFSEditorDelegateType.java
rename to src/main/java/org/olat/repository/handlers/DocumentEditorDelegateType.java
index 24909dee681..42551cf1f1e 100644
--- a/src/main/java/org/olat/repository/handlers/VFSEditorDelegateType.java
+++ b/src/main/java/org/olat/repository/handlers/DocumentEditorDelegateType.java
@@ -29,7 +29,7 @@ import org.olat.core.id.OLATResourceable;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public interface VFSEditorDelegateType {
+public interface DocumentEditorDelegateType {
 	
 	public String getCreateLabelI18nKey();
 	
diff --git a/src/main/java/org/olat/repository/handlers/ExcelVFSEditorDelegateType.java b/src/main/java/org/olat/repository/handlers/ExcelVFSEditorDelegateType.java
index c4ea37bcca4..a6018327fed 100644
--- a/src/main/java/org/olat/repository/handlers/ExcelVFSEditorDelegateType.java
+++ b/src/main/java/org/olat/repository/handlers/ExcelVFSEditorDelegateType.java
@@ -21,7 +21,7 @@ package org.olat.repository.handlers;
 
 import java.io.InputStream;
 
-import org.olat.core.commons.services.filetemplate.ContentProviderFactory;
+import org.olat.core.commons.services.doceditor.ContentProviderFactory;
 import org.olat.core.id.OLATResourceable;
 import org.olat.fileresource.types.XlsFileResource;
 
@@ -31,7 +31,7 @@ import org.olat.fileresource.types.XlsFileResource;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class ExcelVFSEditorDelegateType implements VFSEditorDelegateType  {
+public class ExcelVFSEditorDelegateType implements DocumentEditorDelegateType  {
 
 	@Override
 	public OLATResourceable getOLATResourceable() {
diff --git a/src/main/java/org/olat/repository/handlers/PowerPointVFSEditorDelegateType.java b/src/main/java/org/olat/repository/handlers/PowerPointVFSEditorDelegateType.java
index 2eaf6a1ff1c..6571f871183 100644
--- a/src/main/java/org/olat/repository/handlers/PowerPointVFSEditorDelegateType.java
+++ b/src/main/java/org/olat/repository/handlers/PowerPointVFSEditorDelegateType.java
@@ -21,7 +21,7 @@ package org.olat.repository.handlers;
 
 import java.io.InputStream;
 
-import org.olat.core.commons.services.filetemplate.ContentProviderFactory;
+import org.olat.core.commons.services.doceditor.ContentProviderFactory;
 import org.olat.core.id.OLATResourceable;
 import org.olat.fileresource.types.XlsFileResource;
 
@@ -31,7 +31,7 @@ import org.olat.fileresource.types.XlsFileResource;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class PowerPointVFSEditorDelegateType implements VFSEditorDelegateType  {
+public class PowerPointVFSEditorDelegateType implements DocumentEditorDelegateType  {
 
 	@Override
 	public OLATResourceable getOLATResourceable() {
diff --git a/src/main/java/org/olat/repository/handlers/RepositoryHandlerFactory.java b/src/main/java/org/olat/repository/handlers/RepositoryHandlerFactory.java
index c9f4d9b237c..65f6d291dd1 100644
--- a/src/main/java/org/olat/repository/handlers/RepositoryHandlerFactory.java
+++ b/src/main/java/org/olat/repository/handlers/RepositoryHandlerFactory.java
@@ -80,11 +80,11 @@ public class RepositoryHandlerFactory {
 		registerHandler(new PortfolioHandler(), 42);
 		
 		
-		VFSEditorDelegate wordDelegate = new VFSEditorDelegate(new WordVFSEditorDelegateType());
+		DocumentEditorDelegate wordDelegate = new DocumentEditorDelegate(new WordVFSEditorDelegateType());
 		registerHandler(new WebDocumentHandler(DocFileResource.TYPE_NAME, wordDelegate, wordDelegate), 10001);
-		VFSEditorDelegate excelDelegate = new VFSEditorDelegate(new ExcelVFSEditorDelegateType());
+		DocumentEditorDelegate excelDelegate = new DocumentEditorDelegate(new ExcelVFSEditorDelegateType());
 		registerHandler(new WebDocumentHandler(XlsFileResource.TYPE_NAME, excelDelegate, excelDelegate), 10002);
-		VFSEditorDelegate powerPointDelegate = new VFSEditorDelegate(new PowerPointVFSEditorDelegateType());
+		DocumentEditorDelegate powerPointDelegate = new DocumentEditorDelegate(new PowerPointVFSEditorDelegateType());
 		registerHandler(new WebDocumentHandler(PowerpointFileResource.TYPE_NAME, powerPointDelegate, powerPointDelegate), 10003);
 		registerHandler(new WebDocumentHandler(PdfFileResource.TYPE_NAME), 10010);
 		registerHandler(new WebDocumentHandler(ImageFileResource.TYPE_NAME), 10011);
diff --git a/src/main/java/org/olat/repository/handlers/WordVFSEditorDelegateType.java b/src/main/java/org/olat/repository/handlers/WordVFSEditorDelegateType.java
index 2cf2b056711..7943298273d 100644
--- a/src/main/java/org/olat/repository/handlers/WordVFSEditorDelegateType.java
+++ b/src/main/java/org/olat/repository/handlers/WordVFSEditorDelegateType.java
@@ -21,7 +21,7 @@ package org.olat.repository.handlers;
 
 import java.io.InputStream;
 
-import org.olat.core.commons.services.filetemplate.ContentProviderFactory;
+import org.olat.core.commons.services.doceditor.ContentProviderFactory;
 import org.olat.core.id.OLATResourceable;
 import org.olat.fileresource.types.DocFileResource;
 
@@ -31,7 +31,7 @@ import org.olat.fileresource.types.DocFileResource;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
-public class WordVFSEditorDelegateType implements VFSEditorDelegateType {
+public class WordVFSEditorDelegateType implements DocumentEditorDelegateType {
 
 	@Override
 	public String getCreateLabelI18nKey() {
diff --git a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java
index b7e18a7d392..37e147a97bb 100644
--- a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java
+++ b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java
@@ -19,16 +19,16 @@
  */
 package org.olat.repository.ui;
 
-import static org.olat.core.commons.services.vfs.VFSLeafEditorConfigs.none;
+import static org.olat.core.commons.services.doceditor.DocEditorConfigs.none;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.olat.core.commons.services.doceditor.DocEditor.Mode;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
+import org.olat.core.commons.services.doceditor.DocEditorSecurityCallbackBuilder;
+import org.olat.core.commons.services.doceditor.DocumentEditorService;
+import org.olat.core.commons.services.doceditor.ui.DocEditorController;
 import org.olat.core.commons.services.image.Size;
-import org.olat.core.commons.services.vfs.VFSLeafEditor.Mode;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallback;
-import org.olat.core.commons.services.vfs.VFSLeafEditorSecurityCallbackBuilder;
-import org.olat.core.commons.services.vfs.VFSRepositoryService;
-import org.olat.core.commons.services.vfs.ui.editor.VFSLeafEditorController;
 import org.olat.core.commons.services.video.MovieService;
 import org.olat.core.dispatcher.mapper.Mapper;
 import org.olat.core.gui.UserRequest;
@@ -65,7 +65,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 public class WebDocumentRunController extends BasicController {
 
 	@Autowired
-	private VFSRepositoryService vfsService;
+	private DocumentEditorService docEditorService;
 	@Autowired
 	private MovieService movieService;
 
@@ -102,12 +102,12 @@ public class WebDocumentRunController extends BasicController {
 					mainVC.contextPut("height", 480);
 					mainVC.contextPut("width", 640);
 				}
-			} else if (vfsService.hasEditor(extension, Mode.VIEW)) {
-				VFSLeafEditorSecurityCallback secCallback = VFSLeafEditorSecurityCallbackBuilder.builder()
+			} else if (docEditorService.hasEditor(extension, Mode.VIEW)) {
+				DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder()
 						.withMode(Mode.VIEW)
 						.canClose(false)
 						.build();
-				Controller editCtrl = new VFSLeafEditorController(ureq, wControl, document, secCallback, none(), "o_web_document");
+				Controller editCtrl = new DocEditorController(ureq, wControl, document, secCallback, none(), "o_web_document");
 				listenTo(editCtrl);
 				mainVC.put("content", editCtrl.getInitialComponent());
 			} else {
diff --git a/src/test/java/org/olat/modules/wopi/manager/WopiServiceImplTest.java b/src/test/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiServiceImplTest.java
similarity index 78%
rename from src/test/java/org/olat/modules/wopi/manager/WopiServiceImplTest.java
rename to src/test/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiServiceImplTest.java
index 83faccfe2a5..78cb0906912 100644
--- a/src/test/java/org/olat/modules/wopi/manager/WopiServiceImplTest.java
+++ b/src/test/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiServiceImplTest.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.manager;
+package org.olat.core.commons.services.doceditor.wopi.manager;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -25,13 +25,14 @@ import java.util.Arrays;
 import java.util.List;
 
 import org.junit.Test;
-import org.olat.modules.wopi.Action;
-import org.olat.modules.wopi.App;
-import org.olat.modules.wopi.NetZone;
-import org.olat.modules.wopi.model.ActionImpl;
-import org.olat.modules.wopi.model.AppImpl;
-import org.olat.modules.wopi.model.DiscoveryImpl;
-import org.olat.modules.wopi.model.NetZoneImpl;
+import org.olat.core.commons.services.doceditor.wopi.Action;
+import org.olat.core.commons.services.doceditor.wopi.App;
+import org.olat.core.commons.services.doceditor.wopi.NetZone;
+import org.olat.core.commons.services.doceditor.wopi.manager.WopiServiceImpl;
+import org.olat.core.commons.services.doceditor.wopi.model.ActionImpl;
+import org.olat.core.commons.services.doceditor.wopi.model.AppImpl;
+import org.olat.core.commons.services.doceditor.wopi.model.DiscoveryImpl;
+import org.olat.core.commons.services.doceditor.wopi.model.NetZoneImpl;
 
 
 /**
diff --git a/src/test/java/org/olat/modules/wopi/manager/WopiXStreamTest.java b/src/test/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiXStreamTest.java
similarity index 90%
rename from src/test/java/org/olat/modules/wopi/manager/WopiXStreamTest.java
rename to src/test/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiXStreamTest.java
index 94c58b4a950..039469ab03a 100644
--- a/src/test/java/org/olat/modules/wopi/manager/WopiXStreamTest.java
+++ b/src/test/java/org/olat/core/commons/services/doceditor/wopi/manager/WopiXStreamTest.java
@@ -17,7 +17,7 @@
  * frentix GmbH, http://www.frentix.com
  * <p>
  */
-package org.olat.modules.wopi.manager;
+package org.olat.core.commons.services.doceditor.wopi.manager;
 
 import java.net.URL;
 import java.nio.file.Files;
@@ -26,11 +26,12 @@ import java.nio.file.Paths;
 
 import org.assertj.core.api.SoftAssertions;
 import org.junit.Test;
-import org.olat.modules.wopi.Action;
-import org.olat.modules.wopi.App;
-import org.olat.modules.wopi.Discovery;
-import org.olat.modules.wopi.NetZone;
-import org.olat.modules.wopi.ProofKey;
+import org.olat.core.commons.services.doceditor.wopi.Action;
+import org.olat.core.commons.services.doceditor.wopi.App;
+import org.olat.core.commons.services.doceditor.wopi.Discovery;
+import org.olat.core.commons.services.doceditor.wopi.NetZone;
+import org.olat.core.commons.services.doceditor.wopi.ProofKey;
+import org.olat.core.commons.services.doceditor.wopi.manager.WopiXStream;
 
 /**
  * 
diff --git a/src/test/java/org/olat/modules/wopi/manager/discovery_collabora.xml b/src/test/java/org/olat/core/commons/services/doceditor/wopi/manager/discovery_collabora.xml
similarity index 100%
rename from src/test/java/org/olat/modules/wopi/manager/discovery_collabora.xml
rename to src/test/java/org/olat/core/commons/services/doceditor/wopi/manager/discovery_collabora.xml
diff --git a/src/test/java/org/olat/modules/wopi/manager/discovery_microsoft.xml b/src/test/java/org/olat/core/commons/services/doceditor/wopi/manager/discovery_microsoft.xml
similarity index 100%
rename from src/test/java/org/olat/modules/wopi/manager/discovery_microsoft.xml
rename to src/test/java/org/olat/core/commons/services/doceditor/wopi/manager/discovery_microsoft.xml
diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java
index 81068bb5fe3..2f3807fea8a 100644
--- a/src/test/java/org/olat/test/AllTestsJunit4.java
+++ b/src/test/java/org/olat/test/AllTestsJunit4.java
@@ -429,6 +429,8 @@ import org.junit.runners.Suite;
 	/**
 	 * Pure JUnit test without need of framework
 	 */
+	org.olat.core.commons.services.doceditor.wopi.manager.WopiServiceImplTest.class,
+	org.olat.core.commons.services.doceditor.wopi.manager.WopiXStreamTest.class,
 	org.olat.core.commons.services.commentAndRating.manager.CommentAndRatingServiceTest.class,
 	org.olat.core.commons.services.license.ui.LicenseSelectionConfigTest.class,
 	org.olat.core.gui.components.form.flexible.impl.elements.richText.TextModeTest.class,
@@ -455,8 +457,6 @@ import org.junit.runners.Suite;
 	org.olat.modules.quality.manager.QualityServiceImplTest.class,
 	org.olat.modules.webFeed.manager.FeedManagerImplTest.class,
 	org.olat.modules.webFeed.manager.RomeFeedFetcherTest.class,
-	org.olat.modules.wopi.manager.WopiServiceImplTest.class,
-	org.olat.modules.wopi.manager.WopiXStreamTest.class,
 	org.olat.resource.accesscontrol.provider.auto.manager.AutoAccessManagerImplTest.class,
 	org.olat.resource.accesscontrol.provider.auto.manager.ExternalIdHandlerTest.class,
 	org.olat.resource.accesscontrol.provider.auto.manager.ExternalRefHandlerTest.class,
-- 
GitLab