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 62bdfed5797c6d3f9026d1e9784e5d385ff220e6..ce3f7842535463f9c4943cf93d986435a0cecfcd 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
@@ -166,14 +166,6 @@ public abstract class Dict
 
     public static final String TOO_GENERIC = "too_generic";
 
-    //
-    // Sample & Experiment Browsers
-    //
-
-    public static final String BUTTON_ASSIGN_PROPERTY = "button_assign_property";
-
-    public static final String BUTTON_INVALIDATE = "button_invalidate";
-
     //
     // Sample Browser
     //
@@ -204,6 +196,8 @@ public abstract class Dict
 
     public static final String PART_OF = "part_of";
 
+    public static final String BUTTON_INVALIDATE = "button_invalidate";
+
     //
     // Experiment Browser
     //
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 00c308ffc01eb9e9fb8e2891f43a6bbed02fa0ee..59ef502ad7317df611388d188ae9166ce47bfa9e 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
@@ -86,8 +86,8 @@ final class ComponentProvider
             {
                 public ITabItem create()
                 {
-                    return new DefaultTabItem("Not implemented feature", new DummyComponent(),
-                            false);
+                    return new DefaultTabItem(getMessage(Dict.NOT_IMPLEMENTED),
+                            new DummyComponent(), false);
                 }
 
                 public String getId()
@@ -343,30 +343,18 @@ final class ComponentProvider
 
     public ITabItemFactory getPropertyTypeExperimentTypeAssignmentForm()
     {
-        return new ITabItemFactory()
-            {
-                EntityKind entityKind = EntityKind.EXPERIMENT;
-
-                public ITabItem create()
-                {
-                    Component component = new PropertyTypeAssignmentForm(viewContext, entityKind);
-                    return new DefaultTabItem(getMessage(Dict.ASSIGN_EXPERIMENT_PROPERTY_TYPE),
-                            component, true);
-                }
-
-                public String getId()
-                {
-                    return PropertyTypeAssignmentForm.createId(entityKind);
-                }
-            };
+        return getPropertyTypeAssignmentForm(EntityKind.EXPERIMENT);
     }
 
     public ITabItemFactory getPropertyTypeSampleTypeAssignmentForm()
+    {
+        return getPropertyTypeAssignmentForm(EntityKind.SAMPLE);
+    }
+
+    private ITabItemFactory getPropertyTypeAssignmentForm(final EntityKind entityKind)
     {
         return new ITabItemFactory()
             {
-                EntityKind entityKind = EntityKind.SAMPLE;
-
                 public ITabItem create()
                 {
                     Component component = new PropertyTypeAssignmentForm(viewContext, entityKind);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
index 6a01633ae2f85cd0fb9fc16ee0f6ea49e50fa1f4..630e6647fbbbf10834072908b0435447bdd36bfe 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentBrowserGrid.java
@@ -20,11 +20,16 @@ import java.util.List;
 
 import com.extjs.gxt.ui.client.event.SelectionChangedListener;
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.toolbar.AdapterToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
 
 import ch.systemsx.cisd.openbis.generic.client.shared.EntityKind;
 import ch.systemsx.cisd.openbis.generic.client.shared.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
@@ -71,9 +76,25 @@ public final class ExperimentBrowserGrid extends AbstractBrowserGrid<Experiment,
     {
         super(viewContext, GRID_ID);
         this.topToolbar = topToolbar;
+        extendToolbar();
+        setId(BROWSER_ID);
+    }
+
+    private void extendToolbar()
+    {
         SelectionChangedListener<?> refreshButtonListener = addRefreshButton(topToolbar);
         this.topToolbar.setCriteriaChangedListener(refreshButtonListener);
-        setId(BROWSER_ID);
+        this.topToolbar.add(new FillToolItem());
+
+        String showDetailsTitle = viewContext.getMessage(Dict.BUTTON_SHOW_DETAILS);
+        Button showDetailsButton =
+                createSelectedItemButton(showDetailsTitle, asShowEntityInvoker());
+        this.topToolbar.add(new AdapterToolItem(showDetailsButton));
+
+        this.topToolbar.add(new SeparatorToolItem());
+        String invalidateTitle = viewContext.getMessage(Dict.BUTTON_INVALIDATE);
+        Button invalidateButton = createSelectedItemDummyButton(invalidateTitle);
+        this.topToolbar.add(new AdapterToolItem(invalidateButton));
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
index 2bdd68656df467ad3726c9aa12931fbd6313f104..f56e55db3fb7e93d9383349460df7391d87ef82e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/AbstractBrowserGrid.java
@@ -30,14 +30,18 @@ import com.extjs.gxt.ui.client.data.PagingLoadConfig;
 import com.extjs.gxt.ui.client.data.PagingLoadResult;
 import com.extjs.gxt.ui.client.data.PagingLoader;
 import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.event.ButtonEvent;
 import com.extjs.gxt.ui.client.event.GridEvent;
 import com.extjs.gxt.ui.client.event.Listener;
 import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
 import com.extjs.gxt.ui.client.event.SelectionChangedListener;
+import com.extjs.gxt.ui.client.event.SelectionEvent;
+import com.extjs.gxt.ui.client.event.SelectionListener;
 import com.extjs.gxt.ui.client.store.ListStore;
 import com.extjs.gxt.ui.client.widget.Component;
 import com.extjs.gxt.ui.client.widget.ContentPanel;
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.MessageBox;
 import com.extjs.gxt.ui.client.widget.button.Button;
 import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
 import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
@@ -462,6 +466,85 @@ public abstract class AbstractBrowserGrid<T/* Entity */, M extends ModelData> ex
             };
     }
 
+    protected interface ISelectedEntityInvoker<M>
+    {
+        void invoke(M selectedItem);
+    }
+
+    protected final ISelectedEntityInvoker<M> asShowEntityInvoker()
+    {
+        return new ISelectedEntityInvoker<M>()
+            {
+                public void invoke(M selectedItem)
+                {
+                    showEntityViewer(selectedItem);
+                }
+            };
+    }
+
+    private ISelectedEntityInvoker<M> createNotImplementedInvoker()
+    {
+        return new ISelectedEntityInvoker<M>()
+            {
+                public void invoke(M selectedItem)
+                {
+                    MessageBox.alert(viewContext.getMessage(Dict.MESSAGEBOX_WARNING), viewContext
+                            .getMessage(Dict.NOT_IMPLEMENTED), null);
+                }
+            };
+    }
+
+    /**
+     * @return a button which has no action but is enabled only when one entity in the grid is
+     *         selected. Useful only for writing prototypes.
+     */
+    protected final Button createSelectedItemDummyButton(final String title)
+    {
+        return createSelectedItemButton(title, createNotImplementedInvoker());
+    }
+
+    /**
+     * @return a button which is enabled only when one entity in the grid is selected. When button
+     *         is pressed, the specified invoker action is performed.
+     */
+    protected final Button createSelectedItemButton(final String title,
+            final ISelectedEntityInvoker<M> invoker)
+    {
+        final Button button = new Button(title, new SelectionListener<ButtonEvent>()
+            {
+                @Override
+                public void componentSelected(ButtonEvent ce)
+                {
+                    M selectedItem = tryGetSelectedItem();
+                    if (selectedItem != null)
+                    {
+                        invoker.invoke(selectedItem);
+                    }
+                }
+            });
+        button.setEnabled(false);
+        grid.getSelectionModel().addListener(Events.SelectionChange,
+                new Listener<SelectionEvent<ModelData>>()
+                    {
+                        public void handleEvent(SelectionEvent<ModelData> se)
+                        {
+                            boolean enabled = (se.selection.size() > 0);
+                            button.setEnabled(enabled);
+                        }
+
+                    });
+        return button;
+    }
+
+    /**
+     * @return item selected in the grid or null if nothing is selected (can happen when a grid is
+     *         empty)
+     */
+    protected final M tryGetSelectedItem()
+    {
+        return grid.getSelectionModel().getSelectedItem();
+    }
+
     protected final SelectionChangedListener<?> addRefreshButton(ToolBar container)
     {
         String title = viewContext.getMessage(Dict.BUTTON_SHOW);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
index 4de44ddfb035b1de11da42046283a433aab494fe..ed404d63291bc3c3d0f301b7a5fe67ae866126f2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
@@ -20,11 +20,16 @@ import java.util.List;
 
 import com.extjs.gxt.ui.client.event.SelectionChangedListener;
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
+import com.extjs.gxt.ui.client.widget.button.Button;
+import com.extjs.gxt.ui.client.widget.toolbar.AdapterToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
+import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
 
 import ch.systemsx.cisd.openbis.generic.client.shared.EntityKind;
 import ch.systemsx.cisd.openbis.generic.client.shared.SampleType;
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DispatcherHelper;
@@ -85,9 +90,25 @@ public final class SampleBrowserGrid extends AbstractBrowserGrid<Sample, SampleM
     {
         super(viewContext, GRID_ID + idSuffix);
         this.topToolbar = topToolbar;
+        extendToolbar();
+        setId(BROWSER_ID);
+    }
+
+    private void extendToolbar()
+    {
         SelectionChangedListener<?> refreshButtonListener = addRefreshButton(topToolbar);
         this.topToolbar.setCriteriaChangedListener(refreshButtonListener);
-        setId(BROWSER_ID);
+        this.topToolbar.add(new FillToolItem());
+
+        String showDetailsTitle = viewContext.getMessage(Dict.BUTTON_SHOW_DETAILS);
+        Button showDetailsButton =
+                createSelectedItemButton(showDetailsTitle, asShowEntityInvoker());
+        this.topToolbar.add(new AdapterToolItem(showDetailsButton));
+
+        this.topToolbar.add(new SeparatorToolItem());
+        String invalidateTitle = viewContext.getMessage(Dict.BUTTON_INVALIDATE);
+        Button invalidateButton = createSelectedItemDummyButton(invalidateTitle);
+        this.topToolbar.add(new AdapterToolItem(invalidateButton));
     }
 
     private SampleBrowserGrid(final IViewContext<ICommonClientServiceAsync> viewContext,
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 3b355a3a378f29b23400efa1697ab11e45e1d174..a46c9081f0fe7809fb27a7f889f3f7010475926d 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
@@ -13,6 +13,7 @@ var common = {
   registrator: "Registrator",
   registration_date: "Registration Date",
   filter: "Filter",
+  not_implemented: "Sorry, feature has not been implemented yet!",
   
   //
   // Field
@@ -43,6 +44,8 @@ var common = {
   button_show: "Show",
   button_exportData: "Export Data",
   button_add_group: "Add Group",
+  button_show_details: "Show Details",
+  
   tooltip_refresh_disabled: "To activate select appropriate criteria first.",
   tooltip_refresh_enabled: "Load or update the table.",
   tooltip_export_enabled: "Export the table visible on the screen to an Excel file",
@@ -114,7 +117,7 @@ var common = {
   part_of: "Container {0}",
   invalidation: "Invalidation",
   invalidation_template: "Invalidated by: {0}<br>Invalidation Date: {1}<br>Invalidation Reason: {2}",
-
+  button_invalidate: "Invalidate",
   
   //
   // Experiment Browser