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/ui/RepositoryEntryRuntimeController.java b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
index 517c88e0ee7cc5522cc43a8e9c8d00dc56d6e0da..4daccd03c6e5c819c87ee06c7e370627791ceee5 100644
--- a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
+++ b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java
@@ -582,9 +582,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