diff --git a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java
index a839876dff41ee538fd26413843b23d73ad7eb81..c3b1f4bf1b37e4b0b3a47e0a451662f6f7189efe 100644
--- a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java
+++ b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java
@@ -61,6 +61,9 @@ import org.olat.fileresource.types.XlsFileResource;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryService;
 import org.olat.repository.model.RepositoryEntrySecurity;
+import org.olat.repository.ui.RepositoryEntryRuntimeController;
+import org.olat.repository.ui.RepositoryEntryRuntimeController.RuntimeControllerCreator;
+import org.olat.repository.ui.WebDocumentRunController;
 import org.olat.resource.OLATResource;
 import org.olat.resource.OLATResourceManager;
 
@@ -190,7 +193,7 @@ public class WebDocumentHandler extends FileHandler {
 
 	@Override
 	public boolean supportsLaunch() {
-		return false;
+		return true;
 	}
 
 	@Override
@@ -210,7 +213,13 @@ public class WebDocumentHandler extends FileHandler {
 
 	@Override
 	public MainLayoutController createLaunchController(RepositoryEntry re,  RepositoryEntrySecurity reSecurity, UserRequest ureq, WindowControl wControl) {
-		return null;
+		return new RepositoryEntryRuntimeController(ureq, wControl, re, reSecurity, new RuntimeControllerCreator() {
+			@Override
+			public Controller create(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel,
+					RepositoryEntry entry, RepositoryEntrySecurity reSecurity) {
+				return new WebDocumentRunController(ureq, wControl, entry);
+			}
+		});
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/repository/handlers/WikiHandler.java b/src/main/java/org/olat/repository/handlers/WikiHandler.java
index b09d508d05154263d094d9c2082c6bf67ddb0ad7..87feb3eef8c9a0aea6bcc7192839844f24db8f84 100644
--- a/src/main/java/org/olat/repository/handlers/WikiHandler.java
+++ b/src/main/java/org/olat/repository/handlers/WikiHandler.java
@@ -307,16 +307,13 @@ public class WikiHandler implements RepositoryHandler {
 		String fullFilePath = archivFilePath + File.separator + exportFileName;
 		
 		File fExportZIP = new File(fullFilePath);
-		InputStream fis = wikiZip.getInputStream();
-		
-		try {
-			FileUtils.bcopy(wikiZip.getInputStream(), fExportZIP, "archive wiki");
+
+		try (InputStream fis = wikiZip.getInputStream()) {
+			FileUtils.bcopy(fis, fExportZIP, "archive wiki");
 		} catch (FileNotFoundException e) {
 			log.warn("Can not archive wiki repoEntry=" + repoEntry);
 		} catch (IOException ioe) {
 			log.warn("Can not archive wiki repoEntry=" + repoEntry);
-		} finally {
-			FileUtils.closeSafely(fis);
 		}
 		return exportFileName;
 	}
diff --git a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
index e6ab1adef20201bc283143e8032a57c8efb4fdee..da3120e98109509386438c8d6cee9b07a86cb1b6 100644
--- a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
+++ b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
@@ -812,9 +812,13 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController
 	
 	protected void launchContent(UserRequest ureq, RepositoryEntrySecurity security) {
 		if(security.canLaunch()) {
-			runtimeController = runtimeControllerCreator.create(ureq, getWindowControl(), toolbarPanel, re, reSecurity);
-			listenTo(runtimeController);
-			toolbarPanel.rootController(re.getDisplayname(), runtimeController);
+			if(handler.supportsLaunch()) {
+				runtimeController = runtimeControllerCreator.create(ureq, getWindowControl(), toolbarPanel, re, reSecurity);
+				listenTo(runtimeController);
+				toolbarPanel.rootController(re.getDisplayname(), runtimeController);
+			} else {
+				doDetails(ureq);
+			}
 		} else {
 			runtimeController = new AccessRefusedController(ureq, getWindowControl());
 			listenTo(runtimeController);
diff --git a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java
new file mode 100644
index 0000000000000000000000000000000000000000..50e12c42acd869acd6bd7deb2dc0901dce34e1e1
--- /dev/null
+++ b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java
@@ -0,0 +1,119 @@
+package org.olat.repository.ui;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.olat.core.CoreSpringFactory;
+import org.olat.core.commons.services.image.Size;
+import org.olat.core.commons.services.video.MovieService;
+import org.olat.core.dispatcher.mapper.Mapper;
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.Component;
+import org.olat.core.gui.components.velocity.VelocityContainer;
+import org.olat.core.gui.control.Event;
+import org.olat.core.gui.control.WindowControl;
+import org.olat.core.gui.control.controller.BasicController;
+import org.olat.core.gui.control.generic.iframe.IFrameDisplayController;
+import org.olat.core.gui.media.MediaResource;
+import org.olat.core.gui.util.CSSHelper;
+import org.olat.core.helpers.Settings;
+import org.olat.core.util.FileUtils;
+import org.olat.core.util.vfs.LocalFileImpl;
+import org.olat.core.util.vfs.LocalImpl;
+import org.olat.core.util.vfs.VFSContainer;
+import org.olat.core.util.vfs.VFSItem;
+import org.olat.core.util.vfs.VFSLeaf;
+import org.olat.core.util.vfs.VFSMediaResource;
+import org.olat.fileresource.FileResourceManager;
+import org.olat.repository.RepositoryEntry;
+import org.olat.resource.OLATResource;
+
+/**
+ * 
+ * Initial date: 02.12.2014<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class WebDocumentRunController extends BasicController {
+
+	public WebDocumentRunController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry) {
+		super(ureq, wControl);
+
+		VelocityContainer mainVC = createVelocityContainer("web_content");
+		mainVC.contextPut("displayName", entry.getDisplayname());
+		putInitialPanel(mainVC);
+
+		LocalFileImpl document = getWebDocument(entry);
+		if(document != null) {
+			String filename = document.getName();
+			mainVC.contextPut("filename", filename);
+			String lowerFilename = filename.toLowerCase();
+			String cssClass = CSSHelper.createFiletypeIconCssClassFor(lowerFilename);
+			mainVC.contextPut("cssClass", cssClass);
+			
+			String extension = FileUtils.getFileSuffix(filename);
+			if("png".equals(extension) || "jpg".equals(extension) || "jpeg".equals(extension) || "gif".equals(extension)) {
+				String mediaUrl = registerMapper(ureq, new MediaMapper(document));
+				mainVC.contextPut("image", filename);
+				mainVC.contextPut("mediaUrl", mediaUrl);
+			} else if("mp4".equals(extension) || "m4v".equals(extension) || "mov".equals(extension)) {
+				String mediaUrl = registerMapper(ureq, new MediaMapper(document));
+				mainVC.contextPut("movie", filename);
+				mainVC.contextPut("mediaUrl", Settings.createServerURI() + mediaUrl);
+				Size realSize = CoreSpringFactory.getImpl(MovieService.class).getSize(document, extension);
+				if(realSize != null) {
+					mainVC.contextPut("height", realSize.getHeight());
+					mainVC.contextPut("width", realSize.getWidth());
+				} else {
+					mainVC.contextPut("height", 480);
+					mainVC.contextPut("width", 640);
+				}
+			} else {
+				IFrameDisplayController idc = new IFrameDisplayController(ureq, getWindowControl(), document.getParentContainer(), null, null);
+				listenTo(idc);	
+				idc.setCurrentURI(document.getName());
+				mainVC.put("content", idc.getInitialComponent());
+			}
+		}
+	}
+	
+	@Override
+	protected void doDispose() {
+		//
+	}
+
+	@Override
+	protected void event(UserRequest ureq, Component source, Event event) {
+		//
+	}
+	
+	private LocalFileImpl getWebDocument(RepositoryEntry entry) {
+		OLATResource resource = entry.getOlatResource();
+		VFSContainer fResourceFileroot = FileResourceManager.getInstance()
+				.getFileResourceRootImpl(resource);
+		
+		LocalFileImpl document = null;
+		for(VFSItem item:fResourceFileroot.getItems()) {
+			if(item instanceof VFSLeaf && item instanceof LocalImpl) {
+				LocalFileImpl localItem = (LocalFileImpl)item;
+				if(localItem != null && !localItem.getBasefile().isHidden()) {
+					document = (LocalFileImpl)item;
+				}
+			}	
+		}
+		return document;
+	}
+	
+	private static class MediaMapper implements Mapper {
+		
+		private final VFSLeaf mediaFile;
+		
+		public MediaMapper(VFSLeaf mediaFile) {
+			this.mediaFile = mediaFile;
+		}
+
+		@Override
+		public MediaResource handle(String relPath, HttpServletRequest request) {
+			return new VFSMediaResource(mediaFile);
+		}
+	}
+}
diff --git a/src/main/java/org/olat/repository/ui/_content/web_content.html b/src/main/java/org/olat/repository/ui/_content/web_content.html
new file mode 100644
index 0000000000000000000000000000000000000000..abe13c528fcd85b539a0bc351bf91f51ccdf42fa
--- /dev/null
+++ b/src/main/java/org/olat/repository/ui/_content/web_content.html
@@ -0,0 +1,14 @@
+<h2><i class="o_icon $cssClass"> </i> $displayName</h2>
+#if($image)
+	<img src="$mediaUrl/$filename" />
+#elseif($movie)
+	<p><span id="olatFlashMovieViewer1" class="olatFlashMovieViewer" style="display:block;border:solid 1px #000; width:${width}px; height:${height}px;">
+		<script defer="defer" type="text/javascript">
+		// <![CDATA[
+		    BPlayer.insertPlayer('$mediaUrl/$filename','olatFlashMovieViewer1',$width,$height,0,0,'video',undefined,false,true,false);
+		// ]]>
+		</script>
+	</span></p>
+#elseif($r.available("content"))
+	<div class="o_content clearfix">$r.render("content")</div>
+#end
\ No newline at end of file
diff --git a/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java b/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java
index 4884adb458c0cd88abc3ddb01d189b3b56365a8b..2013f8137497409fe228090169430c843e8fa03d 100644
--- a/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java
+++ b/src/main/java/org/olat/repository/ui/author/RepositoryEditDescriptionController.java
@@ -53,6 +53,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.WebappHelper;
+import org.olat.core.util.i18n.I18nManager;
 import org.olat.core.util.vfs.LocalFileImpl;
 import org.olat.core.util.vfs.LocalFolderImpl;
 import org.olat.core.util.vfs.VFSContainer;
@@ -97,8 +98,7 @@ public class RepositoryEditDescriptionController extends FormBasicController {
 	private static final int movieUploadlimitKB = 102400;
 
 	private FileElement fileUpload, movieUpload;
-	private SingleSelection language;
-	private TextElement externalRef, displayName, authors, expenditureOfWork;
+	private TextElement externalRef, displayName, authors, expenditureOfWork, language;
 	private RichTextElement description, objectives, requirements, credits;
 	private SingleSelection dateTypesEl, publicDatesEl;
 	private DateChooser startDateEl, endDateEl;
@@ -108,6 +108,8 @@ public class RepositoryEditDescriptionController extends FormBasicController {
 	
 	private static final String[] dateKeys = new String[]{ "none", "private", "public"};
 
+	@Autowired
+	private I18nManager i18nmanager;
 	@Autowired
 	private UserManager userManager;
 	@Autowired
@@ -198,16 +200,7 @@ public class RepositoryEditDescriptionController extends FormBasicController {
 		authors = uifactory.addTextElement("cif.authors", "cif.authors", 255, repositoryEntry.getAuthors(), descCont);
 		authors.setDisplaySize(60);
 		
-		String[] languageKeys = new String[] { "de", "en"};
-		String[] languageValues = new String[] { "de", "en"};
-		language = uifactory.addDropdownSingleselect("cif.mainLanguage", "cif.mainLanguage", formLayout, languageKeys, languageValues, null);
-		String selected = languageKeys[0];
-		for(String languageKey:languageKeys) {
-			if(languageKey.equals(repositoryEntry.getMainLanguage())) {
-				selected = languageKey;
-			}
-		}
-		language.select(selected, true);
+		language = uifactory.addTextElement("cif.mainLanguage", "cif.mainLanguage", 16, repositoryEntry.getMainLanguage(), descCont);
 		
 		RepositoryHandler handler = RepositoryHandlerFactory.getInstance().getRepositoryHandler(repositoryEntry);
 		mediaContainer = handler.getMediaContainer(repositoryEntry);
@@ -277,7 +270,7 @@ public class RepositoryEditDescriptionController extends FormBasicController {
 	
 			updateDatesVisibility();
 			uifactory.addSpacerElement("spacer3", descCont, false);
-
+			
 			expenditureOfWork = uifactory.addTextElement("cif.expenditureOfWork", "cif.expenditureOfWork", 100, repositoryEntry.getExpenditureOfWork(), descCont);
 			expenditureOfWork.setExampleKey("details.expenditureOfWork.example", null);
 
@@ -492,7 +485,7 @@ public class RepositoryEditDescriptionController extends FormBasicController {
 		String displayname = displayName.getValue().trim();
 		repositoryEntry.setDisplayname(displayname);
 		
-		String mainLanguage = language.getSelectedKey();
+		String mainLanguage = language.getValue();
 		if(StringHelper.containsNonWhitespace(mainLanguage)) {
 			repositoryEntry.setMainLanguage(mainLanguage);
 		} else {
diff --git a/src/main/java/org/olat/repository/ui/list/_content/details.html b/src/main/java/org/olat/repository/ui/list/_content/details.html
index d83f646c6dd9a71d2799725b3bac1cf0d3c47096..e26ce4049fdfa2b9bc6b6da47dfa466f56466c16 100644
--- a/src/main/java/org/olat/repository/ui/list/_content/details.html
+++ b/src/main/java/org/olat/repository/ui/list/_content/details.html
@@ -46,7 +46,7 @@
 						#if($v.lifecycle.validTo) - $r.formatDate($v.lifecycle.validTo) #end
 					</div>
 					#end
-					#if($v.expenditureOfWork)
+					#if($v.expenditureOfWork && !$v.expenditureOfWork.empty)
 					<div title="$r.translateInAttribute("details.expenditureOfWork.desc")">
 						<i class="o_icon o_icon_expenditure"></i>  
 						$r.escapeHtml($v.expenditureOfWork)