From 6c111c3c09127f70a0999e9b6f788a7aa032b503 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Tue, 17 Mar 2009 10:18:16 +0000
Subject: [PATCH] [LMS-786] change system tests to use top menu, minor: use
 dictionary for menu names

SVN: 10259
---
 .../client/web/client/application/Dict.java   |  22 ++++
 .../client/application/menu/ActionMenu.java   |  18 ++-
 .../web/client/application/menu/TopMenu.java  |  24 +++-
 .../administration/AdministrationMenu.java    |  11 +-
 .../administration/AuthorizationMenu.java     |  10 +-
 .../menu/administration/ProjectMenu.java      |  12 +-
 .../administration/PropertyTypesMenu.java     |  18 +--
 .../menu/administration/VocabularyMenu.java   |  10 +-
 .../application/menu/dataset/DataSetMenu.java |  10 +-
 .../menu/experiment/ExperimentMenu.java       |  12 +-
 .../menu/material/MaterialMenu.java           |  12 +-
 .../application/menu/sample/SampleMenu.java   |  16 +--
 .../cisd/openbis/public/common-dictionary.js  |  45 +++++++
 .../AuthorizationManagementConsolTest.java    |  14 +--
 .../client/application/DataSetSearchTest.java |   5 +-
 .../application/EntityTypeBrowserTest.java    |   9 +-
 .../EntityTypePropertyTypeAssignmentTest.java |  14 +--
 .../application/ExperimentBrowserTest.java    |   5 +-
 .../application/MaterialBrowserTest.java      |   7 +-
 .../application/ProjectRegistrationTest.java  |   8 +-
 .../PropertyTypeAssignmentBrowserTest.java    |   5 +-
 .../application/PropertyTypeBrowserTest.java  |   5 +-
 .../PropertyTypeRegistrationTest.java         |   8 +-
 .../client/application/SampleBrowserTest.java |   5 +-
 .../application/VocabularyBrowserTest.java    |  10 +-
 .../VocabularyRegistrationTest.java           |   5 +-
 .../web/client/application/ui/OpenTab.java    |  42 ++-----
 .../testframework/AbstractGWTTestCase.java    |  24 +---
 .../web/client/testframework/GWTTestUtil.java | 111 +++++++++++-------
 ...nericExperimentAttachmentDownloadTest.java |   5 +-
 .../GenericExperimentRegistrationTest.java    |  16 +--
 .../GenericExperimentViewerTest.java          |   5 +-
 .../sample/GenericSampleRegistrationTest.java |  24 ++--
 .../sample/GenericSampleViewerTest.java       |  10 +-
 34 files changed, 304 insertions(+), 253 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
index 051a6a544af..56fe063e06a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
@@ -322,6 +322,28 @@ public abstract class Dict
 
     public static final String PART_OF_SAMPLE = "part_of_sample";
 
+    //
+    // Menu Titles
+    //
+
+    public static final String MENU_ADMINISTRATION = "menu_administration";
+
+    public static final String MENU_AUTHORIZATION = "menu_authorization";
+
+    public static final String MENU_PROJECT = "menu_project";
+
+    public static final String MENU_PROPERTY_TYPES = "menu_property_types";
+
+    public static final String MENU_VOCABULARY = "menu_vocabulary";
+
+    public static final String MENU_DATA_SET = "menu_data_set";
+
+    public static final String MENU_EXPERIMENT = "menu_experiment";
+
+    public static final String MENU_MATERIAL = "menu_material";
+
+    public static final String MENU_SAMPLE = "menu_sample";
+
     //
     // Tab Titles
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/ActionMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/ActionMenu.java
index b12e2344a54..f0f107152ea 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/ActionMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/ActionMenu.java
@@ -23,9 +23,10 @@ import com.extjs.gxt.ui.client.widget.menu.MenuItem;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.ITabItemFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 
 /**
- * {@link MenuItem} with action fired on click.
+ * {@link MenuItem} with action fired on selection.
  * 
  * @author Izabela Adamczyk
  * @author Piotr Buczek
@@ -33,16 +34,15 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMe
 public class ActionMenu extends MenuItem
 {
 
-    private ActionMenu(final ActionMenuKind action, final String text)
+    private ActionMenu(final String id, final String text)
     {
         super(text);
-        setId(TopMenu.ID + "_" + action.name());
+        setId(id);
     }
 
-    public ActionMenu(final ActionMenuKind action, final String name,
-            final ITabItemFactory tabToOpen)
+    private ActionMenu(final String id, final String name, final ITabItemFactory tabToOpen)
     {
-        this(action, name);
+        this(id, name);
         addSelectionListener(new SelectionListener<ComponentEvent>()
             {
 
@@ -54,4 +54,10 @@ public class ActionMenu extends MenuItem
             });
     }
 
+    public ActionMenu(final ActionMenuKind action, IMessageProvider messageProvider,
+            final ITabItemFactory tabToOpen)
+    {
+        this(action.getMenuId(), action.getMenuText(messageProvider), tabToOpen);
+    }
+
 }
\ No newline at end of file
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 c354dc9c4c9..351a6bb9b6d 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
@@ -40,6 +40,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.datas
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.experiment.ExperimentMenu;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.material.MaterialMenu;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.sample.SampleMenu;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SessionContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.User;
 
@@ -56,11 +57,16 @@ public class TopMenu extends LayoutContainer
 
     public static final String LOGOUT_BUTTON_ID = GenericConstants.ID_PREFIX + "logout-button";
 
+    public static final String ICON_STYLE = "icon-menu-show";
+
+    /** {@link ActionMenu} kind enum with names matching dictionary keys */
     public static enum ActionMenuKind
     {
-        ADMINISTRATION_MENU_MANAGE_GROUPS, AUTHORIZATION_MENU_USERS, AUTHORIZATION_MENU_ROLES,
+        ADMINISTRATION_MENU_MANAGE_GROUPS,
+
+        AUTHORIZATION_MENU_USERS, AUTHORIZATION_MENU_ROLES,
 
-        DATA_SET_MENU_SEARCH, DATA_SET_MENU_IMPORT,
+        DATA_SET_MENU_SEARCH,
 
         EXPERIMENT_MENU_BROWSE, EXPERIMENT_MENU_NEW, EXPERIMENT_MENU_TYPES,
 
@@ -68,13 +74,23 @@ public class TopMenu extends LayoutContainer
 
         SAMPLE_MENU_BROWSE, SAMPLE_MENU_NEW, SAMPLE_MENU_IMPORT, SAMPLE_MENU_TYPES,
 
-        PROJECT_MENU_NEW, PROJECT_MENU_BROWSE,
+        PROJECT_MENU_BROWSE, PROJECT_MENU_NEW,
 
         PROPERTY_TYPES_MENU_BROWSE_PROPERTY_TYPES, PROPERTY_TYPES_MENU_BROWSE_ASSIGNMENTS,
         PROPERTY_TYPES_MENU_NEW_PROPERTY_TYPES, PROPERTY_TYPES_MENU_ASSIGN_TO_EXPERIMENT_TYPE,
         PROPERTY_TYPES_MENU_ASSIGN_TO_SAMPLE_TYPE,
 
-        VOCABULARY_MENU_BROWSE, VOCABULARY_MENU_NEW,
+        VOCABULARY_MENU_BROWSE, VOCABULARY_MENU_NEW;
+
+        public String getMenuId()
+        {
+            return ID + "_" + this.name();
+        }
+
+        public String getMenuText(IMessageProvider messageProvider)
+        {
+            return messageProvider.getMessage(this.name());
+        }
     }
 
     private final ToolBar toolBar;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/AdministrationMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/AdministrationMenu.java
index e44d2e01247..f604e0856c1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/AdministrationMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/AdministrationMenu.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.admi
 
 import com.extjs.gxt.ui.client.widget.menu.Menu;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 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.TopMenu;
@@ -31,16 +32,14 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMess
  */
 public class AdministrationMenu extends TopMenuItem
 {
-    // TODO 2009-03-16, Piotr Buczek: use messageProvider for Strings
-
     public AdministrationMenu(IMessageProvider messageProvider, ComponentProvider componentProvider)
     {
-        super("Administration");
-        setId(TopMenu.ID);
-        setIconStyle("icon-menu-show");
+        super(messageProvider.getMessage(Dict.MENU_ADMINISTRATION));
+        setIconStyle(TopMenu.ICON_STYLE);
+
         Menu menu = new Menu();
         menu.add(new ActionMenu(TopMenu.ActionMenuKind.ADMINISTRATION_MENU_MANAGE_GROUPS,
-                "Manage Groups", componentProvider.getGroupsView()));
+                messageProvider, componentProvider.getGroupsView()));
         menu.add(new ProjectMenu(messageProvider, componentProvider));
         menu.add(new VocabularyMenu(messageProvider, componentProvider));
         menu.add(new PropertyTypesMenu(messageProvider, componentProvider));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/AuthorizationMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/AuthorizationMenu.java
index c2a87de2ce0..1b38bc41a11 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/AuthorizationMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/AuthorizationMenu.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.admi
 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.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.TopMenu;
@@ -34,12 +35,13 @@ public class AuthorizationMenu extends MenuItem
 
     public AuthorizationMenu(IMessageProvider messageProvider, ComponentProvider componentProvider)
     {
-        super("Authorization");
-        setIconStyle("icon-menu-show");
+        super(messageProvider.getMessage(Dict.MENU_AUTHORIZATION));
+        setIconStyle(TopMenu.ICON_STYLE);
+
         Menu menu = new Menu();
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.AUTHORIZATION_MENU_USERS, "Users",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.AUTHORIZATION_MENU_USERS, messageProvider,
                 componentProvider.getPersonsView()));
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.AUTHORIZATION_MENU_ROLES, "Roles",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.AUTHORIZATION_MENU_ROLES, messageProvider,
                 componentProvider.getRolesView()));
         setSubMenu(menu);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/ProjectMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/ProjectMenu.java
index f63a460a4b3..1fbccda6790 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/ProjectMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/ProjectMenu.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.admi
 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.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.TopMenu;
@@ -34,13 +35,14 @@ public class ProjectMenu extends MenuItem
 
     public ProjectMenu(IMessageProvider messageProvider, ComponentProvider componentProvider)
     {
-        super("Project");
-        setIconStyle("icon-menu-show");
+        super(messageProvider.getMessage(Dict.MENU_PROJECT));
+        setIconStyle(TopMenu.ICON_STYLE);
+
         Menu menu = new Menu();
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.PROJECT_MENU_BROWSE, "Browse",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.PROJECT_MENU_BROWSE, messageProvider,
                 componentProvider.getProjectBrowser()));
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.PROJECT_MENU_NEW, "New", componentProvider
-                .getProjectRegistration()));
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.PROJECT_MENU_NEW, messageProvider,
+                componentProvider.getProjectRegistration()));
         setSubMenu(menu);
     }
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/PropertyTypesMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/PropertyTypesMenu.java
index fc44e358786..e19c424edad 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/PropertyTypesMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/PropertyTypesMenu.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.admi
 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.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.TopMenu;
@@ -34,22 +35,21 @@ public class PropertyTypesMenu extends MenuItem
 
     public PropertyTypesMenu(IMessageProvider messageProvider, ComponentProvider componentProvider)
     {
-        super("Property Type");
-        setIconStyle("icon-menu-show");
+        super(messageProvider.getMessage(Dict.MENU_PROPERTY_TYPES));
+        setIconStyle(TopMenu.ICON_STYLE);
+
         Menu menu = new Menu();
         menu.add(new ActionMenu(TopMenu.ActionMenuKind.PROPERTY_TYPES_MENU_BROWSE_PROPERTY_TYPES,
-                "Browse Property Types", componentProvider.getPropertyTypeBrowser()));
+                messageProvider, componentProvider.getPropertyTypeBrowser()));
         menu.add(new ActionMenu(TopMenu.ActionMenuKind.PROPERTY_TYPES_MENU_BROWSE_ASSIGNMENTS,
-                "Browse Assignments", componentProvider.getPropertyTypeAssignmentBrowser()));
+                messageProvider, componentProvider.getPropertyTypeAssignmentBrowser()));
         menu.add(new ActionMenu(TopMenu.ActionMenuKind.PROPERTY_TYPES_MENU_NEW_PROPERTY_TYPES,
-                "New Property Type", componentProvider.getPropertyTypeRegistration()));
+                messageProvider, componentProvider.getPropertyTypeRegistration()));
         menu.add(new ActionMenu(
                 TopMenu.ActionMenuKind.PROPERTY_TYPES_MENU_ASSIGN_TO_EXPERIMENT_TYPE,
-                "Assign to Experiment Type", componentProvider
-                        .getPropertyTypeExperimentTypeAssignmentForm()));
+                messageProvider, componentProvider.getPropertyTypeExperimentTypeAssignmentForm()));
         menu.add(new ActionMenu(TopMenu.ActionMenuKind.PROPERTY_TYPES_MENU_ASSIGN_TO_SAMPLE_TYPE,
-                "Assign to Sample Type", componentProvider
-                        .getPropertyTypeSampleTypeAssignmentForm()));
+                messageProvider, componentProvider.getPropertyTypeSampleTypeAssignmentForm()));
         setSubMenu(menu);
     }
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/VocabularyMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/VocabularyMenu.java
index a9448f20da8..ac831b95e2d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/VocabularyMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/administration/VocabularyMenu.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.admi
 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.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.TopMenu;
@@ -34,12 +35,13 @@ public class VocabularyMenu extends MenuItem
 
     public VocabularyMenu(IMessageProvider messageProvider, ComponentProvider componentProvider)
     {
-        super("Vocabulary");
-        setIconStyle("icon-menu-show");
+        super(messageProvider.getMessage(Dict.MENU_VOCABULARY));
+        setIconStyle(TopMenu.ICON_STYLE);
+
         Menu menu = new Menu();
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.VOCABULARY_MENU_BROWSE, "Browse",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.VOCABULARY_MENU_BROWSE, messageProvider,
                 componentProvider.getVocabularyBrowser()));
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.VOCABULARY_MENU_NEW, "New",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.VOCABULARY_MENU_NEW, messageProvider,
                 componentProvider.getVocabularyRegistration()));
         setSubMenu(menu);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/dataset/DataSetMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/dataset/DataSetMenu.java
index f4963f6c716..97bfbc0499d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/dataset/DataSetMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/dataset/DataSetMenu.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.data
 
 import com.extjs.gxt.ui.client.widget.menu.Menu;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 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.TopMenu;
@@ -34,13 +35,12 @@ public class DataSetMenu extends TopMenuItem
 
     public DataSetMenu(IMessageProvider messageProvider, ComponentProvider componentProvider)
     {
-        super("Data Set");
-        setIconStyle("icon-menu-show");
+        super(messageProvider.getMessage(Dict.MENU_DATA_SET));
+        setIconStyle(TopMenu.ICON_STYLE);
+
         Menu menu = new Menu();
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.DATA_SET_MENU_SEARCH, "Search",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.DATA_SET_MENU_SEARCH, messageProvider,
                 componentProvider.getDataSetSearch()));
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.DATA_SET_MENU_IMPORT, "Import",
-                componentProvider.getDummyComponent()));
         setMenu(menu);
     }
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/experiment/ExperimentMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/experiment/ExperimentMenu.java
index 67639528898..68db2a96dcf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/experiment/ExperimentMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/experiment/ExperimentMenu.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.expe
 
 import com.extjs.gxt.ui.client.widget.menu.Menu;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 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.TopMenu;
@@ -33,17 +34,16 @@ public class ExperimentMenu extends TopMenuItem
 {
     public ExperimentMenu(IMessageProvider messageProvider, ComponentProvider componentProvider)
     {
-        super("Experiment");
-        setIconStyle("icon-menu-show");
+        super(messageProvider.getMessage(Dict.MENU_EXPERIMENT));
+        setIconStyle(TopMenu.ICON_STYLE);
 
         Menu menu = new Menu();
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.EXPERIMENT_MENU_BROWSE, "Browse",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.EXPERIMENT_MENU_BROWSE, messageProvider,
                 componentProvider.getExperimentBrowser()));
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.EXPERIMENT_MENU_NEW, "New",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.EXPERIMENT_MENU_NEW, messageProvider,
                 componentProvider.getExperimentRegistration()));
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.EXPERIMENT_MENU_TYPES, "Types",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.EXPERIMENT_MENU_TYPES, messageProvider,
                 componentProvider.getExperimentTypeBrowser()));
-
         setMenu(menu);
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/material/MaterialMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/material/MaterialMenu.java
index c1fb9819e1d..a157bbb6f1b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/material/MaterialMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/material/MaterialMenu.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.mate
 
 import com.extjs.gxt.ui.client.widget.menu.Menu;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 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.TopMenu;
@@ -34,14 +35,15 @@ public class MaterialMenu extends TopMenuItem
 
     public MaterialMenu(IMessageProvider messageProvider, ComponentProvider componentProvider)
     {
-        super("Material");
-        setIconStyle("icon-menu-show");
+        super(messageProvider.getMessage(Dict.MENU_MATERIAL));
+        setIconStyle(TopMenu.ICON_STYLE);
+
         Menu menu = new Menu();
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.MATERIAL_MENU_BROWSE, "Browse",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.MATERIAL_MENU_BROWSE, messageProvider,
                 componentProvider.getMaterialBrowser()));
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.MATERIAL_MENU_IMPORT, "Import",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.MATERIAL_MENU_IMPORT, messageProvider,
                 componentProvider.getMaterialBatchRegistration()));
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.MATERIAL_MENU_TYPES, "Types",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.MATERIAL_MENU_TYPES, messageProvider,
                 componentProvider.getMaterialTypeBrowser()));
         setMenu(menu);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/sample/SampleMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/sample/SampleMenu.java
index 584ffa3c272..6bf594d13de 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/sample/SampleMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/menu/sample/SampleMenu.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.samp
 import com.extjs.gxt.ui.client.widget.menu.Menu;
 import com.extjs.gxt.ui.client.widget.menu.SeparatorMenuItem;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 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.TopMenu;
@@ -35,16 +36,17 @@ public class SampleMenu extends TopMenuItem
 
     public SampleMenu(IMessageProvider messageProvider, ComponentProvider componentProvider)
     {
-        super("Sample");
-        setIconStyle("icon-menu-show");
+        super(messageProvider.getMessage(Dict.MENU_SAMPLE));
+        setIconStyle(TopMenu.ICON_STYLE);
+
         Menu menu = new Menu();
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.SAMPLE_MENU_BROWSE, "Browse",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.SAMPLE_MENU_BROWSE, messageProvider,
                 componentProvider.getSampleBrowser()));
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.SAMPLE_MENU_NEW, "New", componentProvider
-                .getSampleRegistration()));
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.SAMPLE_MENU_IMPORT, "Import",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.SAMPLE_MENU_NEW, messageProvider,
+                componentProvider.getSampleRegistration()));
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.SAMPLE_MENU_IMPORT, messageProvider,
                 componentProvider.getSampleBatchRegistration()));
-        menu.add(new ActionMenu(TopMenu.ActionMenuKind.SAMPLE_MENU_TYPES, "Types",
+        menu.add(new ActionMenu(TopMenu.ActionMenuKind.SAMPLE_MENU_TYPES, messageProvider,
                 componentProvider.getSampleTypeBrowser()));
         menu.add(new SeparatorMenuItem());
         setMenu(menu);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
index 8557ad9c1a0..5a2e434117e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
@@ -151,6 +151,51 @@ var common = {
   default_value_tooltip: "The value of the assigned property for all currently existing entities.",
   entity_type_assignments: "{0} Type Assignment{1}",
   
+  //
+  // Menu Titles
+  //
+  
+  menu_administration: "Administration",
+  ADMINISTRATION_MENU_MANAGE_GROUPS: "Manage Groups",
+  
+  menu_authorization: "Authorization",
+  AUTHORIZATION_MENU_USERS: "Users",
+  AUTHORIZATION_MENU_ROLES: "Roles",
+
+  menu_data_set: "Data Set",
+  DATA_SET_MENU_SEARCH: "Search",
+  
+  menu_experiment: "Experiment",
+  EXPERIMENT_MENU_BROWSE: "Browse",
+  EXPERIMENT_MENU_NEW: "New",
+  EXPERIMENT_MENU_TYPES: "Types",
+  
+  menu_material: "Material",
+  MATERIAL_MENU_BROWSE: "Browse",
+  MATERIAL_MENU_IMPORT: "Import",
+  MATERIAL_MENU_TYPES: "Types",
+   
+  menu_sample: "Sample",
+  SAMPLE_MENU_BROWSE: "Browse",
+  SAMPLE_MENU_NEW: "New",
+  SAMPLE_MENU_IMPORT: "Import",
+  SAMPLE_MENU_TYPES: "Types",
+  
+  menu_project: "Project",
+  PROJECT_MENU_BROWSE: "Browse",
+  PROJECT_MENU_NEW: "New",
+  
+  menu_property_types: "Property Types",
+  PROPERTY_TYPES_MENU_BROWSE_PROPERTY_TYPES: "Browse Property Types",
+  PROPERTY_TYPES_MENU_BROWSE_ASSIGNMENTS: "Browse Assignments",
+  PROPERTY_TYPES_MENU_NEW_PROPERTY_TYPES: "New Property Types",
+  PROPERTY_TYPES_MENU_ASSIGN_TO_EXPERIMENT_TYPE: "Assign To Experiment Type",
+  PROPERTY_TYPES_MENU_ASSIGN_TO_SAMPLE_TYPE: "Assign To Sample Type",
+  
+  menu_vocabulary: "Vocabulary",
+  VOCABULARY_MENU_BROWSE: "Browse",
+  VOCABULARY_MENU_NEW: "New",
+    
   //
   // Tab Titles
   //
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AuthorizationManagementConsolTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AuthorizationManagementConsolTest.java
index 2afcff58d4d..8a0f413ae35 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AuthorizationManagementConsolTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/AuthorizationManagementConsolTest.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.amc.AddPersonDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.amc.CheckGroup;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.amc.CheckPerson;
@@ -44,8 +44,7 @@ public class AuthorizationManagementConsolTest extends AbstractGWTTestCase
     public final void testCreateGroup()
     {
         final String groupCode = TEST_GROUP;
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.GROUPS,
-                CategoriesBuilder.MenuElementKind.BROWSE);
+        loginAndGotoTab(ActionMenuKind.ADMINISTRATION_MENU_MANAGE_GROUPS);
         remoteConsole.prepare(new CreateGroup(groupCode));
         remoteConsole.prepare(new CheckGroup(groupCode.toUpperCase()));
 
@@ -56,8 +55,7 @@ public class AuthorizationManagementConsolTest extends AbstractGWTTestCase
     {
         // This userId must be one of the ones located on 'etc/passwd' (file based authentication).
         final String userId = USER_ID;
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.PERSONS,
-                CategoriesBuilder.MenuElementKind.BROWSE);
+        loginAndGotoTab(ActionMenuKind.AUTHORIZATION_MENU_USERS);
         remoteConsole.prepare(new CreatePerson(userId));
         remoteConsole.prepare(new CheckPerson(userId));
 
@@ -66,8 +64,7 @@ public class AuthorizationManagementConsolTest extends AbstractGWTTestCase
 
     public final void testCreateRole()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.ROLES,
-                CategoriesBuilder.MenuElementKind.BROWSE);
+        loginAndGotoTab(ActionMenuKind.AUTHORIZATION_MENU_ROLES);
         remoteConsole.prepare(new CreateRole(TEST_GROUP.toUpperCase(), USER_ID,
                 RoleSetCode.OBSERVER.toString()));
         remoteConsole.prepare(new CheckRole(TEST_GROUP.toUpperCase(), USER_ID, RoleSetCode.OBSERVER
@@ -82,8 +79,7 @@ public class AuthorizationManagementConsolTest extends AbstractGWTTestCase
      */
     public final void testCreatePersonByAnUnauthorizedUser()
     {
-        loginAndGotoTab("o",
-                "o", CategoriesBuilder.MenuCategoryKind.PERSONS, CategoriesBuilder.MenuElementKind.BROWSE);
+        loginAndGotoTab("o", "o", ActionMenuKind.AUTHORIZATION_MENU_USERS);
         final String userId = "u";
         remoteConsole.prepare(new CreatePerson(userId));
         FailureExpectation failureExpectation =
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/DataSetSearchTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/DataSetSearchTest.java
index 285f3561229..b739d65dcf7 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/DataSetSearchTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/DataSetSearchTest.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.data.DataSetSearchHitColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.AbstractExternalDataGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.DataSetSearchHitGrid;
@@ -103,7 +103,6 @@ public class DataSetSearchTest extends AbstractGWTTestCase
 
     private void loginAndGotoTab()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.DATA_SETS,
-                CategoriesBuilder.MenuElementKind.SEARCH);
+        loginAndGotoTab(ActionMenuKind.DATA_SET_MENU_SEARCH);
     }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/EntityTypeBrowserTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/EntityTypeBrowserTest.java
index 6fb64094349..71dc00ac4b2 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/EntityTypeBrowserTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/EntityTypeBrowserTest.java
@@ -16,8 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder.MenuCategoryKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder.MenuElementKind;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.EntityTypeColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentTypeGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.material.MaterialTypeGrid;
@@ -36,7 +35,7 @@ public class EntityTypeBrowserTest extends AbstractGWTTestCase
 
     public final void testListMaterialTypes()
     {
-        loginAndGotoTab(MenuCategoryKind.MATERIALS, MenuElementKind.BROWSE_TYPES);
+        loginAndGotoTab(ActionMenuKind.MATERIAL_MENU_TYPES);
         CheckTableCommand table =
                 new CheckTableCommand(MaterialTypeGrid.GRID_ID,
                         MaterialTypeGrid.ListEntitiesCallback.class);
@@ -45,7 +44,7 @@ public class EntityTypeBrowserTest extends AbstractGWTTestCase
 
     public final void testListSampleTypes()
     {
-        loginAndGotoTab(MenuCategoryKind.SAMPLES, MenuElementKind.BROWSE_TYPES);
+        loginAndGotoTab(ActionMenuKind.SAMPLE_MENU_TYPES);
         CheckTableCommand table =
                 new CheckTableCommand(SampleTypeGrid.GRID_ID,
                         SampleTypeGrid.ListEntitiesCallback.class);
@@ -54,7 +53,7 @@ public class EntityTypeBrowserTest extends AbstractGWTTestCase
 
     public final void testListExperimentTypes()
     {
-        loginAndGotoTab(MenuCategoryKind.EXPERIMENTS, MenuElementKind.BROWSE_TYPES);
+        loginAndGotoTab(ActionMenuKind.EXPERIMENT_MENU_TYPES);
         CheckTableCommand table =
                 new CheckTableCommand(ExperimentTypeGrid.GRID_ID,
                         ExperimentTypeGrid.ListEntitiesCallback.class);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/EntityTypePropertyTypeAssignmentTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/EntityTypePropertyTypeAssignmentTest.java
index 5715ea0587a..c277b88635d 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/EntityTypePropertyTypeAssignmentTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/EntityTypePropertyTypeAssignmentTest.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.OpenTab;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.renderers.SimpleYesNoRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.PropertyTypeAssignmentColDefKind;
@@ -57,8 +57,7 @@ public class EntityTypePropertyTypeAssignmentTest extends AbstractGWTTestCase
     private final void prepareListingAfterAssignment(String propertyTypeCode,
             String entityTypeCode, EntityKind entityKind, int expectedEntries, boolean isMandatory)
     {
-        remoteConsole.prepare(new OpenTab(CategoriesBuilder.MenuCategoryKind.PROPERTY_TYPES,
-                CategoriesBuilder.MenuElementKind.LIST_ASSIGNMENTS,
+        remoteConsole.prepare(new OpenTab(ActionMenuKind.PROPERTY_TYPES_MENU_BROWSE_ASSIGNMENTS,
                 PropertyTypeAssignmentForm.AssignPropertyTypeCallback.class));
         CheckPropertyTypeAssignmentTable table = new CheckPropertyTypeAssignmentTable();
         table.expectedRow(new Row().withCell(
@@ -73,8 +72,7 @@ public class EntityTypePropertyTypeAssignmentTest extends AbstractGWTTestCase
 
     public final void testAssignExperimentPropertyType()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.PROPERTY_TYPES,
-                CategoriesBuilder.MenuElementKind.ASSIGN_ETPT);
+        loginAndGotoTab(ActionMenuKind.PROPERTY_TYPES_MENU_ASSIGN_TO_EXPERIMENT_TYPE);
         final boolean mandatory = true;
         remoteConsole.prepare(new FillPropertyTypeAssignmentForm(mandatory, USER_COMMENT,
                 COMPOUND_HCS, "a comment", EXPERIMENT));
@@ -84,12 +82,10 @@ public class EntityTypePropertyTypeAssignmentTest extends AbstractGWTTestCase
 
     public final void testGlobalValueAssignmentSamplePropertyType()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.PROPERTY_TYPES,
-                CategoriesBuilder.MenuElementKind.ASSIGN_STPT);
+        loginAndGotoTab(ActionMenuKind.PROPERTY_TYPES_MENU_ASSIGN_TO_SAMPLE_TYPE);
         remoteConsole.prepare(new FillPropertyTypeAssignmentForm(false, USER_COMMENT,
                 CONTROL_LAYOUT, NO_COMMENT, SAMPLE));
-        remoteConsole.prepare(new OpenTab(CategoriesBuilder.MenuCategoryKind.SAMPLES,
-                CategoriesBuilder.MenuElementKind.BROWSE,
+        remoteConsole.prepare(new OpenTab(ActionMenuKind.SAMPLE_MENU_BROWSE,
                 PropertyTypeAssignmentForm.AssignPropertyTypeCallback.class));
         remoteConsole.prepare(new ListSamples(CISD, CONTROL_LAYOUT));
         CheckSampleTable table = new CheckSampleTable();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ExperimentBrowserTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ExperimentBrowserTest.java
index 62d1d618e3a..a4dcb879537 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ExperimentBrowserTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ExperimentBrowserTest.java
@@ -16,8 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder.MenuCategoryKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder.MenuElementKind;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.CheckExperimentTable;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ExperimentRow;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ListExperiments;
@@ -33,7 +32,7 @@ public class ExperimentBrowserTest extends AbstractGWTTestCase
 
     public final void testListExperiments()
     {
-        loginAndGotoTab(MenuCategoryKind.EXPERIMENTS, MenuElementKind.BROWSE);
+        loginAndGotoTab(ActionMenuKind.EXPERIMENT_MENU_BROWSE);
         remoteConsole.prepare(new ListExperiments("DEFAULT (CISD)", "SIRNA_HCS"));
         CheckExperimentTable table = new CheckExperimentTable();
         table.expectedRow(new ExperimentRow("EXP-REUSE").valid());
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MaterialBrowserTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MaterialBrowserTest.java
index 0cfaa506f76..657295ea0ff 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MaterialBrowserTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/MaterialBrowserTest.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.material.CheckMaterialTable;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.material.ListMaterials;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.material.MaterialRow;
@@ -32,9 +32,8 @@ public class MaterialBrowserTest extends AbstractGWTTestCase
 
     public final void testListMaterials()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.MATERIALS,
-                CategoriesBuilder.MenuElementKind.BROWSE);
-
+        loginAndGotoTab(ActionMenuKind.MATERIAL_MENU_BROWSE);
+        
         remoteConsole.prepare(new ListMaterials("BACTERIUM"));
         CheckMaterialTable table = new CheckMaterialTable();
         table.expectedRow(new MaterialRow("BACTERIUM-X").userProperty("ORGANISM", "FLY"));
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ProjectRegistrationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ProjectRegistrationTest.java
index dcd5843f31b..e2a278fdd07 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ProjectRegistrationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ProjectRegistrationTest.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.OpenTab;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.ProjectColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.project.CheckProjectTable;
@@ -38,13 +38,11 @@ public class ProjectRegistrationTest extends AbstractGWTTestCase
 
     public final void testRegisterProject()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.PROJECTS,
-                CategoriesBuilder.MenuElementKind.REGISTER);
+        loginAndGotoTab(TopMenu.ActionMenuKind.PROJECT_MENU_NEW);
         remoteConsole.prepare(new FillProjectRegistrationForm(PROJECT_CODE_HER_MAJESTY, "CISD",
                 DESCRIPTION_PROJECT_007));
 
-        remoteConsole.prepare(new OpenTab(CategoriesBuilder.MenuCategoryKind.PROJECTS,
-                CategoriesBuilder.MenuElementKind.BROWSE,
+        remoteConsole.prepare(new OpenTab(TopMenu.ActionMenuKind.PROJECT_MENU_BROWSE,
                 ProjectRegistrationForm.ProjectRegistrationCallback.class));
         final CheckProjectTable table = new CheckProjectTable();
         table.expectedRow(new Row().withCell(ProjectColDefKind.CODE.id(), PROJECT_CODE_HER_MAJESTY)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/PropertyTypeAssignmentBrowserTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/PropertyTypeAssignmentBrowserTest.java
index deeb93eee27..87fd000c4e4 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/PropertyTypeAssignmentBrowserTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/PropertyTypeAssignmentBrowserTest.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.PropertyTypeAssignmentColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.CheckPropertyTypeAssignmentTable;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractGWTTestCase;
@@ -32,8 +32,7 @@ public class PropertyTypeAssignmentBrowserTest extends AbstractGWTTestCase
 
     public final void testListAssignments()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.PROPERTY_TYPES,
-                CategoriesBuilder.MenuElementKind.LIST_ASSIGNMENTS);
+        loginAndGotoTab(ActionMenuKind.PROPERTY_TYPES_MENU_BROWSE_ASSIGNMENTS);
         CheckPropertyTypeAssignmentTable table = new CheckPropertyTypeAssignmentTable();
         table.expectedRow(new Row().withCell(
                 PropertyTypeAssignmentColDefKind.PROPERTY_TYPE_CODE.id(), "USER.DESCRIPTION")
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/PropertyTypeBrowserTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/PropertyTypeBrowserTest.java
index 48d6f143e05..dd638d14738 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/PropertyTypeBrowserTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/PropertyTypeBrowserTest.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.PropertyTypeColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.CheckPropertyTypeTable;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractGWTTestCase;
@@ -32,8 +32,7 @@ public class PropertyTypeBrowserTest extends AbstractGWTTestCase
 
     public final void testListPropertyTypes()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.PROPERTY_TYPES,
-                CategoriesBuilder.MenuElementKind.BROWSE);
+        loginAndGotoTab(ActionMenuKind.PROPERTY_TYPES_MENU_BROWSE_PROPERTY_TYPES);
         CheckPropertyTypeTable table = new CheckPropertyTypeTable();
         table.expectedRow(new Row().withCell(PropertyTypeColDefKind.CODE.id(), "PLATE_GEOMETRY"));
         remoteConsole.prepare(table.expectedSize(14));
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/PropertyTypeRegistrationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/PropertyTypeRegistrationTest.java
index edbb06a726c..c3cc6c8781c 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/PropertyTypeRegistrationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/PropertyTypeRegistrationTest.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.OpenTab;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.PropertyTypeColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property_type.CheckPropertyTypeTable;
@@ -46,12 +46,10 @@ public class PropertyTypeRegistrationTest extends AbstractGWTTestCase
 
     public final void testRegisterPropertyType()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.PROPERTY_TYPES,
-                CategoriesBuilder.MenuElementKind.REGISTER);
+        loginAndGotoTab(ActionMenuKind.PROPERTY_TYPES_MENU_NEW_PROPERTY_TYPES);
         remoteConsole.prepare(createFillPropertyTypeRegistrationForm());
 
-        remoteConsole.prepare(new OpenTab(CategoriesBuilder.MenuCategoryKind.PROPERTY_TYPES,
-                CategoriesBuilder.MenuElementKind.BROWSE,
+        remoteConsole.prepare(new OpenTab(ActionMenuKind.PROPERTY_TYPES_MENU_BROWSE_PROPERTY_TYPES,
                 PropertyTypeRegistrationForm.PropertyTypeRegistrationCallback.class));
         final CheckPropertyTypeTable table = new CheckPropertyTypeTable();
         table.expectedRow(new Row().withCell(PropertyTypeColDefKind.CODE.id(),
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SampleBrowserTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SampleBrowserTest.java
index 424d4650542..47ac365618f 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SampleBrowserTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/SampleBrowserTest.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.GroupSelectionWidget;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.CheckSampleTable;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.sample.ExportSamplesTestCommand;
@@ -104,7 +104,6 @@ public class SampleBrowserTest extends AbstractGWTTestCase
 
     private void loginAndGotoListSamplesTab()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.SAMPLES,
-                CategoriesBuilder.MenuElementKind.BROWSE);
+        loginAndGotoTab(ActionMenuKind.SAMPLE_MENU_BROWSE);
     }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/VocabularyBrowserTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/VocabularyBrowserTest.java
index 90a9aa8907c..01bb019823c 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/VocabularyBrowserTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/VocabularyBrowserTest.java
@@ -19,7 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 import com.extjs.gxt.ui.client.widget.grid.Grid;
 import com.google.gwt.user.client.ui.Widget;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.VocabularyColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.VocabularyTermColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.util.GridTestUtils;
@@ -42,8 +42,7 @@ public class VocabularyBrowserTest extends AbstractGWTTestCase
 
     public final void testListVocabularies()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.VOCABULARIES,
-                CategoriesBuilder.MenuElementKind.BROWSE);
+        loginAndGotoTab(ActionMenuKind.VOCABULARY_MENU_BROWSE);
         CheckTableCommand table =
                 new CheckTableCommand(VocabularyGrid.GRID_ID,
                         VocabularyGrid.ListEntitiesCallback.class);
@@ -55,9 +54,8 @@ public class VocabularyBrowserTest extends AbstractGWTTestCase
 
     public final void testShowTermDetails()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.VOCABULARIES,
-                CategoriesBuilder.MenuElementKind.BROWSE);
-
+        loginAndGotoTab(ActionMenuKind.VOCABULARY_MENU_BROWSE);
+        
         remoteConsole.prepare(new ClickOnVocabularyCmd(VOCABULARY_CODE));
 
         CheckTableCommand termsTable =
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/VocabularyRegistrationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/VocabularyRegistrationTest.java
index 6cdd06c3053..54211b5d6fe 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/VocabularyRegistrationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/VocabularyRegistrationTest.java
@@ -16,7 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.vocabulary.FillVocabularyRegistrationForm;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractGWTTestCase;
 
@@ -37,8 +37,7 @@ public class VocabularyRegistrationTest extends AbstractGWTTestCase
 
     public final void testRegisterVocabulary()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.VOCABULARIES,
-                CategoriesBuilder.MenuElementKind.REGISTER);
+        loginAndGotoTab(ActionMenuKind.VOCABULARY_MENU_NEW);
         remoteConsole.prepare(createFillVocabularyRegistrationForm());
 
         // TODO 2008-12-22, Christian Ribeaud: Finish this once we have list vocabularies.
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/OpenTab.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/OpenTab.java
index ffb1d94fa52..56eede514e4 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/OpenTab.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/OpenTab.java
@@ -19,46 +19,21 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.SessionContextCallback;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.LeftMenu;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder.MenuCategoryKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder.MenuElementKind;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.ActionMenu;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractDefaultTestCommand;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.GWTTestUtil;
 
 /**
- * A {@link AbstractDefaultTestCommand} extension for choosing a roles menu element.
+ * A {@link AbstractDefaultTestCommand} extension for opening a tab by selecting an
+ * {@link ActionMenu}.
  * 
  * @author Izabela Adamczyk
+ * @author Piotr Buczek
  */
 public final class OpenTab extends AbstractDefaultTestCommand
 {
-    private String category;
-
-    private String option;
-
-    // TODO 2009-03-16, Piotr Buczek: change to final and remove category/option
-    @SuppressWarnings("unused")
-    private String action;
-
-    public OpenTab(final MenuCategoryKind category, final MenuElementKind option,
-            final Class<? extends AsyncCallback<?>> callbackClass)
-    {
-        if (callbackClass == null)
-        {
-            addCallbackClass(SessionContextCallback.class);
-        } else
-        {
-            addCallbackClass(callbackClass);
-        }
-        this.category = category.name();
-        this.option = option.name();
-    }
-
-    public OpenTab(final MenuCategoryKind category, final MenuElementKind option)
-    {
-        this(category, option, null);
-    }
+    private final ActionMenuKind action;
 
     public OpenTab(final ActionMenuKind action,
             final Class<? extends AsyncCallback<?>> callbackClass)
@@ -70,7 +45,7 @@ public final class OpenTab extends AbstractDefaultTestCommand
         {
             addCallbackClass(callbackClass);
         }
-        this.action = action.name();
+        this.action = action;
     }
 
     public OpenTab(final ActionMenuKind action)
@@ -84,9 +59,6 @@ public final class OpenTab extends AbstractDefaultTestCommand
 
     public final void execute()
     {
-        // TODO 2009-03-16, Piotr Buczek: change to use TopMenu
-        // GWTTestUtil.selectTopMenuWithID(TopMenu.ID, action);
-        GWTTestUtil.selectMenuCategoryWithID(LeftMenu.ID, category);
-        GWTTestUtil.selectMenuWithID(LeftMenu.ID, category, option);
+        GWTTestUtil.selectTopActionMenu(action);
     }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/testframework/AbstractGWTTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/testframework/AbstractGWTTestCase.java
index e621ea5e800..40c9f36cca8 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/testframework/AbstractGWTTestCase.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/testframework/AbstractGWTTestCase.java
@@ -28,8 +28,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAs
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Client;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder.MenuCategoryKind;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder.MenuElementKind;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.ActionMenu;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.Login;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.OpenTab;
@@ -140,30 +139,13 @@ public abstract class AbstractGWTTestCase extends GWTTestCase
 
     // ----------
 
-    /** login default user in and go to the specified tab */
-    protected final void loginAndGotoTab(MenuCategoryKind menuCategoryKind,
-            MenuElementKind menuElementKind)
-    {
-        loginAndGotoTab("test", "a", menuCategoryKind, menuElementKind);
-    }
-
-    /** login specified user in and go to the specified tab */
-    protected final void loginAndGotoTab(String userName, String passwd,
-            MenuCategoryKind menuCategoryKind, MenuElementKind menuElementKind)
-    {
-        remoteConsole.prepare(new Login(userName, passwd));
-        remoteConsole.prepare(new OpenTab(menuCategoryKind, menuElementKind));
-    }
-
-    // ----
-
-    /** login default user in and go to the specified tab (fire specified action menu) */
+    /** login default user in and open tab by {@link ActionMenu} */
     protected final void loginAndGotoTab(ActionMenuKind actionMenuKind)
     {
         loginAndGotoTab("test", "a", actionMenuKind);
     }
 
-    /** login specified user in and go to the specified tab (fire specified action menu) */
+    /** login specified user in and open tab by {@link ActionMenu} */
     protected final void loginAndGotoTab(String userName, String passwd,
             ActionMenuKind actionMenuKind)
     {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/testframework/GWTTestUtil.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/testframework/GWTTestUtil.java
index 3ea85163a52..eb8c127d2ff 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/testframework/GWTTestUtil.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/testframework/GWTTestUtil.java
@@ -45,14 +45,15 @@ import com.extjs.gxt.ui.client.widget.toolbar.ToolItem;
 import com.extjs.gxt.ui.client.widget.tree.Tree;
 import com.extjs.gxt.ui.client.widget.tree.TreeItem;
 import com.google.gwt.user.client.Element;
-import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.ui.ComplexPanel;
 import com.google.gwt.user.client.ui.ListBox;
 import com.google.gwt.user.client.ui.RootPanel;
 import com.google.gwt.user.client.ui.Widget;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.LeftMenu;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.ActionMenu;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenuItem;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.PagingToolBarAdapter;
 
 /**
@@ -68,44 +69,14 @@ public final class GWTTestUtil
     }
 
     /**
-     * Clicks on the menu category with specified id.
+     * Clicks on the {@link ActionMenu} specified by {@link ActionMenuKind}.
      */
-    public static void selectMenuCategoryWithID(final String menu, final String category)
+    public static void selectTopActionMenu(final ActionMenuKind action)
     {
-        final String id = menu + "_" + category;
-        final Widget widget = tryToFindByID(id);
-        assertWidgetFound("Menu category", id, widget);
-        Assert.assertTrue("Widget '" + id + "' isn't a ContentPanel (menu category): "
-                + widget.getClass(), widget instanceof ContentPanel);
-        ((ContentPanel) widget).fireEvent(Events.Select);
-    }
-
-    /**
-     * Clicks on the menu option with specified id.
-     */
-    public static void selectMenuWithID(final String menu, final String category,
-            final String option)
-    {
-        final String id = menu + "_" + category + "_" + option;
+        final String id = action.getMenuId();
         final Widget item = tryToFindByID(id);
         assertWidgetFound("Menu element", id, item);
-        final Widget tree = tryToFindByID(menu + "_" + category + LeftMenu.TREE_SUFFIX);
-        assertWidgetFound("Menu element tree", id + LeftMenu.TREE_SUFFIX, tree);
-        ((Tree) tree).setSelectedItem((TreeItem) item);
-        ((Tree) tree).fireEvent(Event.ONCLICK);
-
-    }
-
-    /**
-     * Clicks on the menu option with specified id.
-     */
-    public static void selectTopMenuWithID(final String menu, final String action)
-    {
-        final String id = menu + "_" + action;
-        final Widget item = tryToFindByID(id);
-        assertWidgetFound("Menu element", id, item);
-        ((MenuItem) item).fireEvent(Event.ONCLICK);
-
+        ((MenuItem) item).fireEvent(Events.Select);
     }
 
     /**
@@ -344,6 +315,12 @@ public final class GWTTestUtil
             if (widget instanceof ComplexPanel)
             {
                 return new ComplexPanelHandler(this).handle((ComplexPanel) widget);
+            } else if (widget instanceof TopMenuItem)
+            {
+                return new TopMenuItemHandler(this).handle((TopMenuItem) widget);
+            } else if (widget instanceof MenuItem)
+            {
+                return new MenuItemHandler(this).handle((MenuItem) widget);
             } else if (widget instanceof Menu)
             {
                 return new MenuHandler(this).handle((Menu) widget);
@@ -411,6 +388,56 @@ public final class GWTTestUtil
         }
     }
 
+    /** Handle for handling {@link TopMenuItem} widget. */
+    private static final class TopMenuItemHandler implements IWidgetHandler<TopMenuItem>
+    {
+        private final IWidgetHandler<Widget> handler;
+
+        TopMenuItemHandler(final IWidgetHandler<Widget> handler)
+        {
+            this.handler = handler;
+        }
+
+        //
+        // IWidgetHandler
+        //
+
+        public final boolean handle(final TopMenuItem topMenuItem)
+        {
+            if (handler.handle(topMenuItem.getMenu()))
+            {
+                return true;
+            }
+            return false;
+        }
+
+    }
+
+    /** Handle for handling {@link MenuItem} widget. */
+    private static final class MenuItemHandler implements IWidgetHandler<MenuItem>
+    {
+        private final IWidgetHandler<Widget> handler;
+
+        MenuItemHandler(final IWidgetHandler<Widget> handler)
+        {
+            this.handler = handler;
+        }
+
+        //
+        // IWidgetHandler
+        //
+
+        public final boolean handle(final MenuItem menuItem)
+        {
+            if (handler.handle(menuItem.getSubMenu()))
+            {
+                return true;
+            }
+            return false;
+        }
+
+    }
+
     /** Handle for handling {@link Menu} widget. */
     private static final class MenuHandler implements IWidgetHandler<Menu>
     {
@@ -427,17 +454,19 @@ public final class GWTTestUtil
 
         public final boolean handle(final Menu menu)
         {
-
-            for (final Item i : menu.getItems())
+            if (menu != null)
             {
-                if (handler.handle(i))
+                for (final Item i : menu.getItems())
                 {
-                    return true;
+                    if (handler.handle(i))
+                    {
+                        return true;
+                    }
                 }
-
             }
             return false;
         }
+
     }
 
     private static final class TreeHandler implements IWidgetHandler<Tree>
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentAttachmentDownloadTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentAttachmentDownloadTest.java
index fbc124cf762..683b7ecb7e5 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentAttachmentDownloadTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentAttachmentDownloadTest.java
@@ -27,7 +27,7 @@ import com.google.gwt.http.client.Response;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.AppEvents;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ListExperiments;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ShowExperiment;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractDefaultTestCommand;
@@ -49,8 +49,7 @@ public class GenericExperimentAttachmentDownloadTest extends AbstractGWTTestCase
     private void prepareShowExperiment(final String projectName, final String experimentTypeName,
             final String experimentCode)
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.EXPERIMENTS,
-                CategoriesBuilder.MenuElementKind.BROWSE);
+        loginAndGotoTab(ActionMenuKind.EXPERIMENT_MENU_BROWSE);
         remoteConsole.prepare(new ListExperiments(projectName, experimentTypeName));
         remoteConsole.prepare(new ShowExperiment(experimentCode));
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentRegistrationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentRegistrationTest.java
index 4906cfd2d3d..3bb539184ee 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentRegistrationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentRegistrationTest.java
@@ -16,7 +16,8 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.experiment;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.OpenTab;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.CheckExperimentTable;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experiment.ChooseTypeOfNewExperiment;
@@ -38,8 +39,7 @@ public class GenericExperimentRegistrationTest extends AbstractGWTTestCase
 
     private final void loginAndPreprareRegistration(final String sampleType)
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.EXPERIMENTS,
-                CategoriesBuilder.MenuElementKind.REGISTER);
+        loginAndGotoTab(ActionMenuKind.EXPERIMENT_MENU_NEW);
         remoteConsole.prepare(new ChooseTypeOfNewExperiment(sampleType));
     }
 
@@ -56,8 +56,9 @@ public class GenericExperimentRegistrationTest extends AbstractGWTTestCase
                                 "MALE")).addProperty(
                         new PropertyField(GenericExperimentRegistrationForm.ID
                                 + "user-purchase-date", "2008-12-17")));
-        remoteConsole.prepare(new OpenTab(CategoriesBuilder.MenuCategoryKind.EXPERIMENTS,
-                CategoriesBuilder.MenuElementKind.BROWSE,
+        remoteConsole.prepare(new OpenTab(TopMenu.ActionMenuKind.EXPERIMENT_MENU_BROWSE,
+        // CategoriesBuilder.MenuCategoryKind.EXPERIMENTS,
+                // CategoriesBuilder.MenuElementKind.BROWSE,
                 GenericExperimentRegistrationForm.RegisterExperimentCallback.class));
         remoteConsole.prepare(new ListExperiments("DEFAULT", experimentTypeCode));
         remoteConsole.prepare(new CheckExperimentTable()
@@ -80,8 +81,9 @@ public class GenericExperimentRegistrationTest extends AbstractGWTTestCase
                 .addProperty(
                         new PropertyField(GenericExperimentRegistrationForm.ID
                                 + "user-purchase-date", "2008-12-18")));
-        remoteConsole.prepare(new OpenTab(CategoriesBuilder.MenuCategoryKind.SAMPLES,
-                CategoriesBuilder.MenuElementKind.BROWSE,
+        remoteConsole.prepare(new OpenTab(TopMenu.ActionMenuKind.SAMPLE_MENU_BROWSE,
+        // CategoriesBuilder.MenuCategoryKind.SAMPLES,
+                // CategoriesBuilder.MenuElementKind.BROWSE,
                 GenericExperimentRegistrationForm.RegisterExperimentCallback.class));
         remoteConsole.prepare(new ListSamples("CISD", "CELL_PLATE"));
         CheckSampleTable table = new CheckSampleTable();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewerTest.java
index a83a7d48b04..7ab25a570ef 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/GenericExperimentViewerTest.java
@@ -20,7 +20,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAs
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.SessionContextCallback;
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.Login;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.columns.DataSetRow;
@@ -200,8 +200,7 @@ public class GenericExperimentViewerTest extends AbstractGWTTestCase
     private void prepareShowExperiment(final String projectName, final String experimentTypeName,
             final String experimentCode)
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.EXPERIMENTS,
-                CategoriesBuilder.MenuElementKind.BROWSE);
+        loginAndGotoTab(ActionMenuKind.EXPERIMENT_MENU_BROWSE);
         remoteConsole.prepare(new ListExperiments(projectName, experimentTypeName));
         remoteConsole.prepare(new ShowExperiment(experimentCode));
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationTest.java
index fa8428c1de7..2b1985a8704 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleRegistrationTest.java
@@ -16,7 +16,8 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.GroupSelectionWidget;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.OpenTab;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample.CommonSampleColDefKind;
@@ -48,8 +49,7 @@ public class GenericSampleRegistrationTest extends AbstractGWTTestCase
 
     private final void loginAndPreprareRegistration(final String sampleType)
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.SAMPLES,
-                CategoriesBuilder.MenuElementKind.REGISTER);
+        loginAndGotoTab(ActionMenuKind.SAMPLE_MENU_NEW);
         remoteConsole.prepare(new ChooseTypeOfNewSample(sampleType));
     }
 
@@ -60,8 +60,7 @@ public class GenericSampleRegistrationTest extends AbstractGWTTestCase
         remoteConsole.prepare(new FillSampleRegistrationForm("CISD", GROUP_CL)
                 .addProperty(new PropertyField(GenericSampleRegistrationForm.ID + "plate-geometry",
                         "1536_WELLS_32X48")));
-        remoteConsole.prepare(new OpenTab(CategoriesBuilder.MenuCategoryKind.SAMPLES,
-                CategoriesBuilder.MenuElementKind.BROWSE,
+        remoteConsole.prepare(new OpenTab(TopMenu.ActionMenuKind.SAMPLE_MENU_BROWSE,
                 GenericSampleRegistrationForm.RegisterSampleCallback.class));
         remoteConsole.prepare(new ListSamples("CISD", sampleTypeCode));
         remoteConsole.prepare(new CheckSampleTable().expectedRow(new SampleRow(GROUP_CL)
@@ -75,8 +74,7 @@ public class GenericSampleRegistrationTest extends AbstractGWTTestCase
      */
     public final void testRegisterSampleByAnUnauthorizedUser()
     {
-        loginAndGotoTab("observer",
-                "observer", CategoriesBuilder.MenuCategoryKind.SAMPLES, CategoriesBuilder.MenuElementKind.REGISTER);
+        loginAndGotoTab("observer", "observer", ActionMenuKind.SAMPLE_MENU_NEW);
         remoteConsole.prepare(new ChooseTypeOfNewSample(SampleTypeCode.CONTROL_LAYOUT.getCode()));
         remoteConsole.prepare(new FillSampleRegistrationForm("TESTGROUP", GROUP_CL + "1")
                 .addProperty(new PropertyField(GenericSampleRegistrationForm.ID + "plate-geometry",
@@ -97,8 +95,7 @@ public class GenericSampleRegistrationTest extends AbstractGWTTestCase
         loginAndPreprareRegistration(sampleTypeCode);
         remoteConsole.prepare(new FillSampleRegistrationForm("CISD", sampleCode)
                 .parent("MP1-MIXED"));
-        remoteConsole.prepare(new OpenTab(CategoriesBuilder.MenuCategoryKind.SAMPLES,
-                CategoriesBuilder.MenuElementKind.BROWSE,
+        remoteConsole.prepare(new OpenTab(TopMenu.ActionMenuKind.SAMPLE_MENU_BROWSE,
                 GenericSampleRegistrationForm.RegisterSampleCallback.class));
         remoteConsole.prepare(new ListSamples("CISD", sampleTypeCode));
         remoteConsole.prepare(new CheckSampleTable().expectedRow(new SampleRow(sampleCode
@@ -114,8 +111,7 @@ public class GenericSampleRegistrationTest extends AbstractGWTTestCase
         loginAndPreprareRegistration(sampleTypeCode);
         remoteConsole.prepare(new FillSampleRegistrationForm("CISD", sampleCode)
                 .container(containerCode));
-        remoteConsole.prepare(new OpenTab(CategoriesBuilder.MenuCategoryKind.SAMPLES,
-                CategoriesBuilder.MenuElementKind.BROWSE,
+        remoteConsole.prepare(new OpenTab(TopMenu.ActionMenuKind.SAMPLE_MENU_BROWSE,
                 GenericSampleRegistrationForm.RegisterSampleCallback.class));
         remoteConsole.prepare(new ListSamples("CISD", SampleTypeCode.CELL_PLATE.getCode()));
         remoteConsole.prepare(new ShowSample(containerCode));
@@ -131,8 +127,7 @@ public class GenericSampleRegistrationTest extends AbstractGWTTestCase
     public final void testRegisterSharedSample()
     {
         final String sampleTypeCode = SampleTypeCode.CONTROL_LAYOUT.getCode();
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.SAMPLES,
-                CategoriesBuilder.MenuElementKind.REGISTER);
+        loginAndGotoTab(ActionMenuKind.SAMPLE_MENU_NEW);
         remoteConsole.prepare(new ChooseTypeOfNewSample(sampleTypeCode));
         final String description = "A very nice control layout.";
         remoteConsole.prepare(new FillSampleRegistrationForm(
@@ -141,8 +136,7 @@ public class GenericSampleRegistrationTest extends AbstractGWTTestCase
                         description)).addProperty(
                 new PropertyField(GenericSampleRegistrationForm.ID + "plate-geometry",
                         "1536_WELLS_32X48")));
-        remoteConsole.prepare(new OpenTab(CategoriesBuilder.MenuCategoryKind.SAMPLES,
-                CategoriesBuilder.MenuElementKind.BROWSE,
+        remoteConsole.prepare(new OpenTab(TopMenu.ActionMenuKind.SAMPLE_MENU_BROWSE,
                 GenericSampleRegistrationForm.RegisterSampleCallback.class));
         remoteConsole.prepare(new ListSamples(GroupSelectionWidget.SHARED_GROUP_CODE,
                 sampleTypeCode));
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewerTest.java
index fe547bd9a0b..758c8d6df6d 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewerTest.java
@@ -31,7 +31,7 @@ import com.extjs.gxt.ui.client.widget.grid.Grid;
 import com.google.gwt.user.client.rpc.AsyncCallback;
 import com.google.gwt.user.client.ui.Widget;
 
-import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.CategoriesBuilder;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.menu.TopMenu.ActionMenuKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ExternalDataModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample.CommonSampleColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.columns.DataSetRow;
@@ -60,8 +60,7 @@ public class GenericSampleViewerTest extends AbstractGWTTestCase
 
     public final void testShowMasterPlateView()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.SAMPLES,
-                CategoriesBuilder.MenuElementKind.BROWSE);
+        loginAndGotoTab(ActionMenuKind.SAMPLE_MENU_BROWSE);
         remoteConsole.prepare(new ListSamples("CISD", "CONTROL_LAYOUT"));
         remoteConsole.prepare(new ShowSample(CONTROL_LAYOUT_EXAMPLE));
         final CheckSample checkSample = new CheckSample(GROUP_IDENTIFIER, CONTROL_LAYOUT_EXAMPLE);
@@ -84,8 +83,7 @@ public class GenericSampleViewerTest extends AbstractGWTTestCase
 
     public final void testShowCellPlateView()
     {
-        loginAndGotoTab(CategoriesBuilder.MenuCategoryKind.SAMPLES,
-                CategoriesBuilder.MenuElementKind.BROWSE);
+        loginAndGotoTab(ActionMenuKind.SAMPLE_MENU_BROWSE);
         remoteConsole.prepare(new ListSamples("CISD", "CELL_PLATE"));
         remoteConsole.prepare(new ShowSample(CELL_PLATE_EXAMPLE));
         final CheckSample checkSample = new CheckSample(GROUP_IDENTIFIER, CELL_PLATE_EXAMPLE);
@@ -158,7 +156,7 @@ public class GenericSampleViewerTest extends AbstractGWTTestCase
                             }
                         };
                 }
-        
+
             });
 
         launchTest(60000);
-- 
GitLab