diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
index 413a3057c4526363213d149dd695ccb7c67224dc..95484d6320dc3ddd11cab44257dd55788b696f59 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/framework/ComponentProvider.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.framework;
 
 import com.extjs.gxt.ui.client.widget.Component;
+import com.google.gwt.user.client.Window;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ActionContext;
@@ -63,8 +64,11 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.script.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.script.ScriptRegistrationForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.vocabulary.VocabularyGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.vocabulary.VocabularyRegistrationForm;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.webapp.WebAppComponent;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.webapp.WebAppUrl;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.log.LoggingConsole;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.WebApp;
 
 /**
  * Creates and provides GUI modules/components (such as sample browser).
@@ -1654,4 +1658,46 @@ public final class ComponentProvider
 
             };
     }
+
+    public AbstractTabItemFactory createWebApp(final WebApp webApp)
+    {
+        return new AbstractTabItemFactory()
+            {
+                @Override
+                public ITabItem create()
+                {
+                    WebAppUrl url =
+                            new WebAppUrl(Window.Location.getProtocol(), Window.Location.getHost(),
+                                    webApp.getCode(), viewContext.getModel().getSessionContext()
+                                            .getSessionID());
+                    return createRegistrationTab(getTabTitle(),
+                            DatabaseModificationAwareComponent
+                                    .wrapUnaware(new WebAppComponent(url)));
+                }
+
+                @Override
+                public String getId()
+                {
+                    return WebAppComponent.getId(webApp.getCode());
+                }
+
+                @Override
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.WEB_APP, HelpPageAction.VIEW);
+                }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return webApp.getLabel();
+                }
+
+                @Override
+                public String tryGetLink()
+                {
+                    return null;
+                }
+            };
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/help/HelpPageIdentifier.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/help/HelpPageIdentifier.java
index 2e52fac178f8d5602de8a33978c4943d7b23634a..a899e5375809dbfff396f824e27dc526fd278c92 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/help/HelpPageIdentifier.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/help/HelpPageIdentifier.java
@@ -38,7 +38,7 @@ public class HelpPageIdentifier
     public static enum HelpPageDomain
     {
         // base domains (as in menu)
-        EXPERIMENT, SAMPLE, DATA_SET, MATERIAL, ADMINISTRATION, SEARCH,
+        EXPERIMENT, SAMPLE, DATA_SET, MATERIAL, ADMINISTRATION, SEARCH, WEB_APP,
 
         // entity types
         EXPERIMENT_TYPE(EXPERIMENT), SAMPLE_TYPE(SAMPLE), DATA_SET_TYPE(DATA_SET), MATERIAL_TYPE(
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java
index 47c2d1e368bf16014b2cdbbcef0ba30750e3b633..8ec867cd3d7734f07b84283339e8938e289084a2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/TopMenu.java
@@ -119,7 +119,8 @@ public class TopMenu extends LayoutContainer
         toolBar.add(new BrowseMenu(viewContext, componentProvider));
         toolBar.add(new NewMenu(viewContext, componentProvider));
         toolBar.add(new ImportMenu(viewContext, componentProvider));
-        toolBar.add(new ModulesMenu(viewContext, viewContext.getClientPluginFactoryProvider()));
+        toolBar.add(new ModulesMenu(viewContext, viewContext.getClientPluginFactoryProvider(),
+                componentProvider));
         toolBar.add(new FillToolItem());
         toolBar.add(new SearchWidget(viewContext));
         toolBar.add(new SeparatorToolItem());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModulesMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModulesMenu.java
index 79ceff936c333df9100b7b497eac92146265cff2..50fa0d34a5fbcd4a996cb86dac8c8419a9e1d7bb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModulesMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/modules/ModulesMenu.java
@@ -16,18 +16,27 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.modules;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import com.extjs.gxt.ui.client.widget.menu.Menu;
 import com.extjs.gxt.ui.client.widget.menu.MenuItem;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ComponentProvider;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.ActionMenu;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.IActionMenuItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenuItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IClientPluginFactoryProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModule;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.plugin.IModuleInitializationObserver;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.webapp.WebAppSortingAndCodeComparator;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.WebApp;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.WebAppContext;
 
 /**
  * Modules top menu.
@@ -37,10 +46,18 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMess
 public class ModulesMenu extends TopMenuItem implements IModuleInitializationObserver
 {
 
-    public ModulesMenu(IMessageProvider messageProvider,
-            IClientPluginFactoryProvider clientPluginFactoryProvider)
+    private IViewContext<?> viewContext;
+
+    private ComponentProvider componentProvider;
+
+    public ModulesMenu(IViewContext<?> viewContext,
+            IClientPluginFactoryProvider clientPluginFactoryProvider,
+            ComponentProvider componentProvider)
     {
-        super(messageProvider.getMessage(Dict.MENU_MODULES));
+        super(viewContext.getMessage(Dict.MENU_MODULES));
+
+        this.viewContext = viewContext;
+        this.componentProvider = componentProvider;
 
         setId(TopMenu.ID + "_MODULES");
         Menu submenu = new Menu();
@@ -64,10 +81,42 @@ public class ModulesMenu extends TopMenuItem implements IModuleInitializationObs
                 submenu.add(menuItem);
             }
         }
-        simplifyIfNecessary(this);
-        if (submenu.getItemCount() > 0)
+    }
+
+    void addWebAppsItems()
+    {
+        List<WebApp> webApps = new ArrayList<WebApp>();
+
+        for (WebApp webApp : getViewContext().getModel().getApplicationInfo().getWebapps())
         {
-            show();
+            if (webApp.matchesContext(WebAppContext.MODULES_MENU))
+            {
+                webApps.add(webApp);
+            }
+        }
+
+        Collections.sort(webApps, new WebAppSortingAndCodeComparator());
+
+        Menu submenu = getMenu();
+        for (final WebApp webApp : webApps)
+        {
+            IActionMenuItem actionMenuItem = new IActionMenuItem()
+                {
+                    @Override
+                    public String getMenuText(IMessageProvider messageProvider)
+                    {
+                        return webApp.getLabel();
+                    }
+
+                    @Override
+                    public String getMenuId()
+                    {
+                        return TopMenu.ID + "_" + webApp.getCode();
+                    }
+                };
+
+            submenu.add(new ActionMenu(actionMenuItem, viewContext, componentProvider
+                    .createWebApp(webApp)));
         }
     }
 
@@ -92,6 +141,19 @@ public class ModulesMenu extends TopMenuItem implements IModuleInitializationObs
     public void notify(List<IModule> successfullyInitializedModules)
     {
         addModuleItems(successfullyInitializedModules);
+        addWebAppsItems();
+
+        simplifyIfNecessary(this);
+
+        if (getMenu().getItemCount() > 0)
+        {
+            show();
+        }
+    }
+
+    private IViewContext<?> getViewContext()
+    {
+        return viewContext;
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java
index 82f2850c9c103454e8e05cf82d9c0222e096de7d..0958b926bbedb91edb82df341234af5d5fc941dc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AbstractViewer.java
@@ -473,6 +473,7 @@ public abstract class AbstractViewer<D extends IEntityInformationHolder> extends
                                                             webApp.getCode(), getSessionId());
                                             url.setEntityKind(entity.getEntityKind());
                                             url.setEntityType(entity.getEntityType());
+                                            url.setEntityIdentifier(entity.getIdentifier());
                                             url.setEntityPermId(entity.getPermId());
                                             return new WebAppComponent(url);
                                         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppComponent.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppComponent.java
index fb9c0b93f3c9d39192224fe315ba58b08ffd73f1..9d7df130f823d07a0711a2d1e7df76530306dd87 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppComponent.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppComponent.java
@@ -19,6 +19,8 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.webapp
 import com.extjs.gxt.ui.client.widget.WidgetComponent;
 import com.google.gwt.user.client.ui.Frame;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
+
 /**
  * Component that displays a web application in an IFRAME.
  * 
@@ -27,8 +29,15 @@ import com.google.gwt.user.client.ui.Frame;
 public class WebAppComponent extends WidgetComponent
 {
 
+    private static final String ID_PREFIX = GenericConstants.ID_PREFIX + "webapp_";
+
     public WebAppComponent(WebAppUrl url)
     {
         super(new Frame(url.toString()));
     }
+
+    public static String getId(String webAppCode)
+    {
+        return ID_PREFIX + webAppCode;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrl.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrl.java
index 6fa4b40dba43ee9aecfd0e169d7948ad36f47c8c..ac386c118f909abaac31a0fd7d64a1a2d17311ef 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrl.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrl.java
@@ -52,7 +52,9 @@ public class WebAppUrl
 
         builder.setProtocol(openbisProtocol);
         builder.setHost(openbisHost);
-        builder.setPath(webAppCode);
+        // TODO remove the hardcoded part after development is finished
+        builder.setPath("ch.systemsx.cisd.openbis.plugin.screening.OpenBIS/resources/applications/"
+                + webAppCode + "/html");
         builder.setParameter(WebAppUrlParameter.SESSION_ID.getName(), sessionId);
     }
 
@@ -72,6 +74,14 @@ public class WebAppUrl
         }
     }
 
+    public void setEntityIdentifier(String entityIdentifier)
+    {
+        if (entityIdentifier != null)
+        {
+            builder.setParameter(WebAppUrlParameter.ENTITY_IDENTIFIER.getName(), entityIdentifier);
+        }
+    }
+
     public void setEntityPermId(String entityPermId)
     {
         if (entityPermId != null)
@@ -85,5 +95,4 @@ public class WebAppUrl
     {
         return builder.buildString();
     }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrlParameter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrlParameter.java
index 551fd183d7e20121c35fed00032a681c3e9b1a05..ad8f65a7574a888f773ad51f78c60cda183f7983 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrlParameter.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/webapp/WebAppUrlParameter.java
@@ -25,7 +25,7 @@ public enum WebAppUrlParameter
 {
 
     SESSION_ID("session-id"), ENTITY_KIND("entity-kind"), ENTITY_TYPE("entity-type"),
-    ENTITY_PERM_ID("entity-perm-id");
+    ENTITY_IDENTIFIER("entity-identifier"), ENTITY_PERM_ID("entity-perm-id");
 
     private final String name;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebAppContext.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebAppContext.java
index beac2d089454bb37b5e3aebe8fc02ea65ed17a91..7c1bbbba5044080336556b063e413e11b6b615e1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebAppContext.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/WebAppContext.java
@@ -24,7 +24,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 public enum WebAppContext
 {
 
-    QUERIES_MENU("queries-menu"), EXPERIMENT_DETAILS_VIEW("experiment-details-view"),
+    MODULES_MENU("modules-menu"), EXPERIMENT_DETAILS_VIEW("experiment-details-view"),
     SAMPLE_DETAILS_VIEW("sample-details-view"), DATA_SET_DETAILS_VIEW("data-set-details-view"),
     MATERIAL_DETAILS_VIEW("material-details-view");
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/js/openbis.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/js/openbis.js
index e35025bfb4377979b4dfef992b07bb0153ace058..9e14d8d90e94584b5825433399b4bb3a1c258fa2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/js/openbis.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/js/openbis.js
@@ -341,3 +341,39 @@ actionDeferrer.prototype.dependencyCompleted = function(key) {
 	}
 }
 
+function openbisWebAppContext(){
+	this.sessionId = this.getParameter("session-id");
+	this.entityKind = this.getParameter("entity-kind");
+	this.entityType = this.getParameter("entity-type");
+	this.entityIdentifier = this.getParameter("entity-identifier");
+	this.entityPermId = this.getParameter("entity-perm-id");
+}
+
+openbisWebAppContext.prototype.getSessionId = function(){
+	return this.sessionId;
+}
+
+openbisWebAppContext.prototype.getEntityKind = function(){
+	return this.entityKind;
+}
+
+openbisWebAppContext.prototype.getEntityType = function(){
+	return this.entityType;
+}
+
+openbisWebAppContext.prototype.getEntityIdentifier = function(){
+	return this.entityIdentifier;
+}
+
+openbisWebAppContext.prototype.getEntityPermId = function(){
+	return this.entityPermId;
+}
+
+openbisWebAppContext.prototype.getParameter = function(parameterName){
+	var match = location.search.match(RegExp("[?|&]"+parameterName+'=(.+?)(&|$)'));
+	if(match){
+		return decodeURIComponent(match[1]);
+	}else{
+		return null;
+	}
+}
diff --git a/openbis/source/javascript/openbis.js b/openbis/source/javascript/openbis.js
index 466a18a5abf580c2e6d07f818e06b7da877d03c6..f5a686c3ced032d78e7eab28a69b468b54563ab4 100644
--- a/openbis/source/javascript/openbis.js
+++ b/openbis/source/javascript/openbis.js
@@ -395,3 +395,40 @@ openbis.prototype.listPlateImageReferences = function(dataSetIdentifier, wellPos
             success: action
     });
 }
+
+function openbisWebAppContext(){
+	this.sessionId = this.getParameter("session-id");
+	this.entityKind = this.getParameter("entity-kind");
+	this.entityType = this.getParameter("entity-type");
+	this.entityIdentifier = this.getParameter("entity-identifier");
+	this.entityPermId = this.getParameter("entity-perm-id");
+}
+
+openbisWebAppContext.prototype.getSessionId = function(){
+	return this.sessionId;
+}
+
+openbisWebAppContext.prototype.getEntityKind = function(){
+	return this.entityKind;
+}
+
+openbisWebAppContext.prototype.getEntityType = function(){
+	return this.entityType;
+}
+
+openbisWebAppContext.prototype.getEntityIdentifier = function(){
+	return this.entityIdentifier;
+}
+
+openbisWebAppContext.prototype.getEntityPermId = function(){
+	return this.entityPermId;
+}
+
+openbisWebAppContext.prototype.getParameter = function(parameterName){
+	var match = location.search.match(RegExp("[?|&]"+parameterName+'=(.+?)(&|$)'));
+	if(match){
+		return decodeURIComponent(match[1]);
+	}else{
+		return null;
+	}
+}