diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
index 8121bafc4280ca364d07471d739b9dd1a1efa2db..f14a388bcfbd512e7a372b31678a068ea6f0570d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
@@ -180,6 +180,11 @@ public interface ICommonClientService extends IClientService
     public MetaprojectAssignments getMetaprojectAssignments(Long metaprojectId,
             MetaprojectAssignmentsFetchOption[] fetchOptions) throws UserFailureException;
 
+    /**
+     * Returns metaproject.
+     */
+    public Metaproject getMetaproject(Long metaprojectId) throws UserFailureException;
+
     /**
      * Like {@link #prepareExportSamples(TableExportCriteria)}, but for scripts.
      */
@@ -749,6 +754,10 @@ public interface ICommonClientService extends IClientService
     /** Deletes the specified projects. */
     public void deleteProjects(List<TechId> projectIds, String reason) throws UserFailureException;
 
+    /** Deletes the specified metaprojects. */
+    public void deleteMetaprojects(List<TechId> metaprojectIds, String reason)
+            throws UserFailureException;
+
     /** Deletes the specified spaces. */
     public void deleteSpaces(List<TechId> spaceIds, String reason) throws UserFailureException;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index 93ef7d92b0dfaffb988643313ca6129e6a2f6783..d5baf81ca29a864a1685ef579848357ca0fb6c93 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
@@ -162,6 +162,11 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
             MetaprojectAssignmentsFetchOption[] fetchOptions,
             final AsyncCallback<MetaprojectAssignments> asyncCallback);
 
+    /**
+     * @see ICommonClientService#getMetaproject(Long)
+     */
+    public void getMetaproject(Long metaprojectId, final AsyncCallback<Metaproject> asyncCallback);
+
     /** @see ICommonClientService#prepareExportScripts(TableExportCriteria) */
     public void prepareExportScripts(
             TableExportCriteria<TableModelRowWithObject<Script>> exportCriteria,
@@ -652,6 +657,10 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     public void deleteProjects(List<TechId> projectIds, String reason,
             AsyncCallback<Void> asyncCallback);
 
+    /** @see ICommonClientService#deleteMetaprojects(List, String) */
+    public void deleteMetaprojects(List<TechId> metaprojectIds, String reason,
+            AsyncCallback<Void> asyncCallback);
+
     /** @see ICommonClientService#deleteSpaces(List, String) */
     public void deleteSpaces(List<TechId> spaceIds, String reason, AsyncCallback<Void> asyncCallback);
 
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 de54cd3260faea9e7b9a5dad531592e798c11665..16d6af194ffef7429b7244856c16c39d960336db 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
@@ -80,6 +80,8 @@ public abstract class Dict
 
     public static final String BREADCRUMBS_SEPARATOR = "breadcrumbs_separator";
 
+    public static final String METAPROJECT = "metaproject";
+
     public static final String METAPROJECTS = "metaprojects";
 
     public static final String METAPROJECTS_HINT = "metaprojects_hint";
@@ -1158,6 +1160,8 @@ public abstract class Dict
 
     public static final String BUTTON_DELETE_PROJECT = "button_delete_project";
 
+    public static final String BUTTON_DELETE_METAPROJECT = "button_delete_metaproject";
+
     public static final String BUTTON_CONFIGURE = "button_configure";
 
     public static final String BUTTON_FILTERS = "button_filters";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabHelper.java
index 2bab93f3c025f93e6ff31876d7826b38f7af038c..0bfeba3355c644e176eceedaf031ce17f0ec180c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabHelper.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/listener/OpenEntityDetailsTabHelper.java
@@ -29,8 +29,10 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpP
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageAction;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.help.HelpPageIdentifier.HelpPageDomain;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewer;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.metaproject.viewer.MetaprojectViewer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
@@ -140,4 +142,47 @@ public class OpenEntityDetailsTabHelper
         tabFactory.setInBackground(keyPressed);
         DispatcherHelper.dispatchNaviEvent(tabFactory);
     }
+
+    public static void openMetaproject(final IViewContext<?> viewContext,
+            final IIdAndCodeHolder metaproject, boolean keyPressed)
+    {
+        AbstractTabItemFactory tabFactory;
+        tabFactory = new AbstractTabItemFactory()
+            {
+                @Override
+                public ITabItem create()
+                {
+                    final DatabaseModificationAwareComponent viewer =
+                            MetaprojectViewer.create(viewContext, metaproject.getId());
+                    return DefaultTabItem.create(getTabTitle(), viewer, viewContext, false);
+                }
+
+                @Override
+                public String getId()
+                {
+                    return MetaprojectViewer.createId(metaproject.getId());
+                }
+
+                @Override
+                public String getTabTitle()
+                {
+                    return AbstractViewer.getTitle(viewContext, Dict.METAPROJECT, metaproject);
+                }
+
+                @Override
+                public HelpPageIdentifier getHelpPageIdentifier()
+                {
+                    return new HelpPageIdentifier(HelpPageDomain.METAPROJECT, HelpPageAction.VIEW);
+                }
+
+                @Override
+                public String tryGetLink()
+                {
+                    // TODO return a link
+                    return null;
+                }
+            };
+        tabFactory.setInBackground(keyPressed);
+        DispatcherHelper.dispatchNaviEvent(tabFactory);
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/dialog/MetaprojectDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/dialog/MetaprojectDeletionConfirmationDialog.java
new file mode 100644
index 0000000000000000000000000000000000000000..ebbbbe959f873a4e8417260f9bc374bd65e97e51
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/dialog/MetaprojectDeletionConfirmationDialog.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2009 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.metaproject.dialog;
+
+import java.util.Collections;
+
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
+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.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataListPermanentDeletionConfirmationDialog;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+
+public final class MetaprojectDeletionConfirmationDialog extends
+        AbstractDataListPermanentDeletionConfirmationDialog<Long>
+{
+
+    public MetaprojectDeletionConfirmationDialog(IViewContext<?> viewContext, Long metaprojectId,
+            AbstractAsyncCallback<Void> callback)
+    {
+        super(viewContext, Collections.singletonList(metaprojectId), callback);
+        this.setId("metaproject-confirmation-dialog");
+    }
+
+    @Override
+    protected void executeDeletion(AsyncCallback<Void> deletionCallback)
+    {
+        viewContext.getCommonService().deleteMetaprojects(TechId.createList(data),
+                reason.getValue(), deletionCallback);
+    }
+
+    @Override
+    protected String getEntityName()
+    {
+        return messageProvider.getMessage(Dict.METAPROJECT);
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/MetaprojectTree.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/MetaprojectTree.java
index f665de755dd9d4f9bce34a3bc40654bdbe473036..0307c4ced091b8e083ea874c1259fd8158f7a646 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/MetaprojectTree.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/MetaprojectTree.java
@@ -227,6 +227,20 @@ public class MetaprojectTree extends TreeGrid<MetaprojectTreeItemData> implement
                     items.add(new MetaprojectTreeMetaprojectItemData(count.getMetaproject()));
                 }
 
+                Collections.sort(items, new Comparator<MetaprojectTreeItemData>()
+                    {
+                        @Override
+                        public int compare(MetaprojectTreeItemData o1, MetaprojectTreeItemData o2)
+                        {
+                            MetaprojectTreeMetaprojectItemData m1 =
+                                    (MetaprojectTreeMetaprojectItemData) o1;
+                            MetaprojectTreeMetaprojectItemData m2 =
+                                    (MetaprojectTreeMetaprojectItemData) o2;
+                            return m1.getMetaproject().getName()
+                                    .compareTo(m2.getMetaproject().getName());
+                        }
+                    });
+
                 callback.onSuccess(items);
             }
         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/widget/MetaprojectTreeMetaprojectItemWidget.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/widget/MetaprojectTreeMetaprojectItemWidget.java
index 186545210a5cef1efdf7e08f43c73e0b6783fc36..8b32d3f5a13c19527022566998ff9905d4cd0dcf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/widget/MetaprojectTreeMetaprojectItemWidget.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/widget/MetaprojectTreeMetaprojectItemWidget.java
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.metaproject.tree.widget;
 
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.dom.client.ClickHandler;
 import com.google.gwt.event.dom.client.MouseOutEvent;
 import com.google.gwt.event.dom.client.MouseOutHandler;
 import com.google.gwt.event.dom.client.MouseOverEvent;
@@ -27,7 +29,10 @@ import com.google.gwt.user.client.ui.Widget;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.listener.OpenEntityDetailsTabHelper;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.metaproject.tree.model.MetaprojectTreeMetaprojectItemData;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.WidgetUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.lang.StringEscapeUtils;
 
 /**
@@ -83,8 +88,24 @@ public class MetaprojectTreeMetaprojectItemWidget extends MetaprojectTreeItemWid
     {
         if (link == null)
         {
-            // TODO make a real link that opens a metaproject detail view
-            link = new InlineLabel(getViewContext().getMessage(Dict.METAPROJECT_TREE_INFO_LINK));
+            ClickHandler listener = new ClickHandler()
+                {
+                    @Override
+                    public void onClick(ClickEvent event)
+                    {
+                        OpenEntityDetailsTabHelper.openMetaproject(getViewContext(),
+                                data.getMetaproject(),
+                                WidgetUtils.ifSpecialKeyPressed(event.getNativeEvent()));
+                    }
+                };
+
+            // TODO create href
+            String href = "";
+
+            link =
+                    LinkRenderer.getLinkWidget(
+                            getViewContext().getMessage(Dict.METAPROJECT_TREE_INFO_LINK), listener,
+                            href);
             link.setVisible(isSelected());
         }
         return link;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/viewer/MetaprojectViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/viewer/MetaprojectViewer.java
new file mode 100644
index 0000000000000000000000000000000000000000..30f102b3d9384fdb3292eb34f179475110dd46cd
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/viewer/MetaprojectViewer.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2008 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.metaproject.viewer;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import com.extjs.gxt.ui.client.widget.Label;
+import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
+
+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.DatabaseModificationAwareComponent;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.IDatabaseModificationObserver;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewer;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.metaproject.dialog.MetaprojectDeletionConfirmationDialog;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
+
+/**
+ * @author pkupczyk
+ */
+public final class MetaprojectViewer extends AbstractViewer<IEntityInformationHolder> implements
+        IDatabaseModificationObserver
+{
+    private static final String PREFIX = "metaproject-viewer_";
+
+    public static final String ID_PREFIX = GenericConstants.ID_PREFIX + PREFIX;
+
+    private final Long metaprojectId;
+
+    private Metaproject originalMetaproject;
+
+    public static DatabaseModificationAwareComponent create(final IViewContext<?> viewContext,
+            final Long metaprojectId)
+    {
+        MetaprojectViewer viewer = new MetaprojectViewer(viewContext, metaprojectId);
+        return new DatabaseModificationAwareComponent(viewer, viewer);
+    }
+
+    private MetaprojectViewer(final IViewContext<?> viewContext, final Long metaprojectId)
+    {
+        super(viewContext, createId(metaprojectId));
+        this.metaprojectId = metaprojectId;
+        setLayout(new BorderLayout());
+        extendToolBar();
+        reloadAllData();
+    }
+
+    public static String createId(final Long metaprojectId)
+    {
+        return ID_PREFIX + metaprojectId;
+    }
+
+    private void extendToolBar()
+    {
+        if (viewContext.isSimpleOrEmbeddedMode())
+        {
+            return;
+        }
+        addToolBarButton(createDeleteButton(new IDelegatedAction()
+            {
+                @Override
+                public void execute()
+                {
+                    new MetaprojectDeletionConfirmationDialog(viewContext,
+                            originalMetaproject.getId(), createPermanentDeletionCallback()).show();
+                }
+            }));
+    }
+
+    @Override
+    protected void reloadAllData()
+    {
+        reloadData(new AbstractAsyncCallback<Metaproject>(viewContext)
+            {
+                @Override
+                protected void process(Metaproject result)
+                {
+                    recreateView(result);
+                }
+
+                @Override
+                public void finishOnFailure(Throwable caught)
+                {
+                    setupRemovedEntityView();
+                }
+            });
+    }
+
+    protected void reloadData(AbstractAsyncCallback<Metaproject> callback)
+    {
+        viewContext.getCommonService().getMetaproject(metaprojectId, callback);
+    }
+
+    private void recreateView(final Metaproject metaproject)
+    {
+        updateOriginalMetaproject(metaproject);
+        removeAll();
+
+        // TODO layout
+        add(new Label(metaproject.getIdentifier()));
+
+        layout();
+    }
+
+    private void updateOriginalMetaproject(Metaproject metaproject)
+    {
+        this.originalMetaproject = metaproject;
+        updateBreadcrumbs();
+        setToolBarButtonsEnabled(true);
+    }
+
+    @Override
+    public void setupRemovedEntityView()
+    {
+        removeAll();
+        updateTitle(getOriginalDataDescription() + " does not exist any more.");
+        setToolBarButtonsEnabled(false);
+    }
+
+    @Override
+    protected String getOriginalDataDescription()
+    {
+        return viewContext.getMessage(Dict.METAPROJECT) + " " + originalMetaproject.getName();
+    }
+
+    @Override
+    protected void showEntityEditor(boolean inBackground)
+    {
+        // TODO
+    }
+
+    @Override
+    public void update(Set<DatabaseModificationKind> observedModifications)
+    {
+        reloadAllData();
+    }
+
+    @Override
+    public DatabaseModificationKind[] getRelevantModifications()
+    {
+        Set<DatabaseModificationKind> result = new HashSet<DatabaseModificationKind>();
+        DatabaseModificationKind.addAny(result, ObjectKind.METAPROJECT);
+        DatabaseModificationKind.addAny(result, ObjectKind.EXPERIMENT);
+        DatabaseModificationKind.addAny(result, ObjectKind.SAMPLE);
+        DatabaseModificationKind.addAny(result, ObjectKind.DATA_SET);
+        DatabaseModificationKind.addAny(result, ObjectKind.MATERIAL);
+        return result.toArray(DatabaseModificationKind.EMPTY_ARRAY);
+    }
+
+    @Override
+    protected String getDeleteButtonLabel()
+    {
+        return viewContext.getMessage(Dict.BUTTON_DELETE_METAPROJECT);
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index 283db3e20e85ff72631c46907a3058197f67168f..94b0b2f33bffb529612806e0f0db2021d6a427ec 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -112,6 +112,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.server.translator.UserFailure
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.TSVRenderer;
 import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.metaproject.IMetaprojectId;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.metaproject.MetaprojectTechIdId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
@@ -735,6 +736,14 @@ public final class CommonClientService extends AbstractClientService implements
                 metaprojectId), fetchOptionsSet);
     }
 
+    @Override
+    public Metaproject getMetaproject(Long metaprojectId)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        return commonServer.getMetaproject(getSessionToken(),
+                new MetaprojectTechIdId(metaprojectId));
+    }
+
     @Override
     public List<AuthorizationGroup> listAuthorizationGroups()
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
@@ -1605,6 +1614,21 @@ public final class CommonClientService extends AbstractClientService implements
         commonServer.deleteProjects(sessionToken, projectIds, reason);
     }
 
+    @Override
+    public void deleteMetaprojects(List<TechId> metaprojectIds, String reason)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        final String sessionToken = getSessionToken();
+
+        List<IMetaprojectId> ids = new ArrayList<IMetaprojectId>();
+        for (TechId metaprojectId : metaprojectIds)
+        {
+            ids.add(new MetaprojectTechIdId(metaprojectId));
+        }
+
+        commonServer.deleteMetaprojects(sessionToken, ids, reason);
+    }
+
     @Override
     public void deleteSpaces(List<TechId> groupIds, String reason)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index 312eeb612aae2d83fdec69dbf4a48b9b93e5e887..b9b215a5dd2b0287640c66d8094618bd2216915b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -677,7 +677,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     {
         final Session session = getSession(sessionToken);
         final AuthorizationServiceUtils authorization = getAuthorizationService(session);
-        final MetaprojectPE metaproject = getMetaproject(sessionToken, metaprojectId);
+        final Metaproject metaproject = getMetaproject(sessionToken, metaprojectId);
         final ISampleLister lister = businessObjectFactory.createSampleLister(session);
 
         List<Sample> samples =
@@ -763,7 +763,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     {
         final Session session = getSession(sessionToken);
         final AuthorizationServiceUtils authorization = getAuthorizationService(session);
-        final MetaprojectPE metaproject = getMetaproject(sessionToken, metaprojectId);
+        final Metaproject metaproject = getMetaproject(sessionToken, metaprojectId);
         final IDatasetLister lister = createDatasetLister(session);
 
         final List<ExternalData> datasets = lister.listByMetaprojectId(metaproject.getId());
@@ -917,9 +917,9 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         final Session session = getSession(sessionToken);
         final AuthorizationServiceUtils authorization = getAuthorizationService(session);
 
-        MetaprojectPE metaproject = getMetaproject(sessionToken, metaprojectId);
+        Metaproject metaproject = getMetaproject(sessionToken, metaprojectId);
         Collection<MetaprojectAssignmentPE> assignments =
-                getMetaprojectAssignments(metaproject, EntityKind.EXPERIMENT);
+                getMetaprojectAssignments(metaproject.getId(), EntityKind.EXPERIMENT);
         List<ExperimentPE> experimentsPE = new ArrayList<ExperimentPE>();
 
         for (MetaprojectAssignmentPE assignment : assignments)
@@ -1586,9 +1586,9 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     public List<Material> listMetaprojectMaterials(String sessionToken, IMetaprojectId metaprojectId)
     {
         final Session session = getSession(sessionToken);
-        final MetaprojectPE metaprojectPE = getMetaproject(sessionToken, metaprojectId);
+        final Metaproject metaproject = getMetaproject(sessionToken, metaprojectId);
         final IMaterialLister materialLister = businessObjectFactory.createMaterialLister(session);
-        return materialLister.list(new MetaprojectCriteria(metaprojectPE.getId()), true);
+        return materialLister.list(new MetaprojectCriteria(metaproject.getId()), true);
     }
 
     @Override
@@ -2453,8 +2453,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     {
         List<EntityTypePE> types = new ArrayList<EntityTypePE>();
         if ((entityKind.equals(EntityKind.SAMPLE) || entityKind.equals(EntityKind.DATA_SET) || entityKind
-                .equals(EntityKind.MATERIAL))
-                && EntityType.isDefinedInFileEntityTypeCode(type))
+                .equals(EntityKind.MATERIAL)) && EntityType.isDefinedInFileEntityTypeCode(type))
         {
             types.addAll(getDAOFactory().getEntityTypeDAO(
                     DtoConverters.convertEntityKind(entityKind)).listEntityTypes());
@@ -3728,8 +3727,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     public MetaprojectAssignmentsCount getMetaprojectAssignmentsCount(String sessionToken,
             IMetaprojectId metaprojectId)
     {
-        MetaprojectPE metaprojectPE = getMetaproject(sessionToken, metaprojectId);
-        Metaproject metaproject = MetaprojectTranslator.translate(metaprojectPE);
+        Metaproject metaproject = getMetaproject(sessionToken, metaprojectId);
         return getMetaprojectAssignmentsCount(metaproject);
     }
 
@@ -3760,10 +3758,9 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         String baseIndexURL = getBaseIndexURL(sessionToken);
         AuthorizationServiceUtils authorizationUtils = getAuthorizationService(session);
 
-        MetaprojectPE metaprojectPE = getMetaproject(sessionToken, metaprojectId);
-
+        Metaproject metaproject = getMetaproject(sessionToken, metaprojectId);
         MetaprojectAssignments metaprojectAssignments = new MetaprojectAssignments();
-        metaprojectAssignments.setMetaproject(MetaprojectTranslator.translate(metaprojectPE));
+        metaprojectAssignments.setMetaproject(metaproject);
 
         List<Experiment> experiments = new ArrayList<Experiment>();
         List<Sample> samples = new ArrayList<Sample>();
@@ -3773,7 +3770,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         if (fetchOptions.contains(MetaprojectAssignmentsFetchOption.EXPERIMENTS))
         {
             for (MetaprojectAssignmentPE metaprojectAssignmentPE : getMetaprojectAssignments(
-                    metaprojectPE, EntityKind.EXPERIMENT))
+                    metaproject.getId(), EntityKind.EXPERIMENT))
             {
                 if (authorizationUtils.canAccessExperiment(metaprojectAssignmentPE.getExperiment()))
                 {
@@ -3791,7 +3788,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         if (fetchOptions.contains(MetaprojectAssignmentsFetchOption.SAMPLES))
         {
             for (MetaprojectAssignmentPE metaprojectAssignmentPE : getMetaprojectAssignments(
-                    metaprojectPE, EntityKind.SAMPLE))
+                    metaproject.getId(), EntityKind.SAMPLE))
             {
                 if (authorizationUtils.canAccessSample(metaprojectAssignmentPE.getSample()))
                 {
@@ -3808,7 +3805,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         if (fetchOptions.contains(MetaprojectAssignmentsFetchOption.DATA_SETS))
         {
             for (MetaprojectAssignmentPE metaprojectAssignmentPE : getMetaprojectAssignments(
-                    metaprojectPE, EntityKind.DATA_SET))
+                    metaproject.getId(), EntityKind.DATA_SET))
             {
                 if (authorizationUtils.canAccessDataSet(metaprojectAssignmentPE.getDataSet()))
                 {
@@ -3825,7 +3822,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         if (fetchOptions.contains(MetaprojectAssignmentsFetchOption.MATERIALS))
         {
             for (MetaprojectAssignmentPE metaprojectAssignmentPE : getMetaprojectAssignments(
-                    metaprojectPE, EntityKind.MATERIAL))
+                    metaproject.getId(), EntityKind.MATERIAL))
             {
                 materials.add(MaterialTranslator.translate(metaprojectAssignmentPE.getMaterial(),
                         null));
@@ -3900,7 +3897,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_USER)
-    public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId)
+    public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId, String reason)
     {
         if (metaprojectId == null)
         {
@@ -3914,7 +3911,23 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
 
         getAuthorizationService(session).checkAccessMetaproject(metaprojectBO.getMetaproject());
 
-        metaprojectBO.deleteByMetaprojectId(metaprojectId);
+        metaprojectBO.deleteByMetaprojectId(metaprojectId, reason);
+    }
+
+    @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    public void deleteMetaprojects(String sessionToken, List<IMetaprojectId> metaprojectIds,
+            String reason)
+    {
+        if (metaprojectIds == null)
+        {
+            throw new UserFailureException("Metaproject ids cannot be null");
+        }
+
+        for (IMetaprojectId metaprojectId : metaprojectIds)
+        {
+            deleteMetaproject(sessionToken, metaprojectId, reason);
+        }
     }
 
     @Override
@@ -3977,7 +3990,9 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         return MetaprojectTranslator.translate(metaprojectPE);
     }
 
-    private MetaprojectPE getMetaproject(String sessionToken, IMetaprojectId metaprojectId)
+    @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    public Metaproject getMetaproject(String sessionToken, IMetaprojectId metaprojectId)
     {
         if (metaprojectId == null)
         {
@@ -3997,14 +4012,13 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
 
         AuthorizationServiceUtils authorizationUtils = getAuthorizationService(session);
         authorizationUtils.checkAccessMetaproject(metaprojectPE);
-
-        return metaprojectPE;
+        return MetaprojectTranslator.translate(metaprojectPE);
     }
 
-    private Collection<MetaprojectAssignmentPE> getMetaprojectAssignments(
-            MetaprojectPE metaproject, EntityKind entityKind)
+    private Collection<MetaprojectAssignmentPE> getMetaprojectAssignments(Long metaprojectId,
+            EntityKind entityKind)
     {
-        return getDAOFactory().getMetaprojectDAO().listMetaprojectAssignments(metaproject.getId(),
+        return getDAOFactory().getMetaprojectDAO().listMetaprojectAssignments(metaprojectId,
                 DtoConverters.convertEntityKind(entityKind));
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
index fe5759bdf2981ed2a202fd6222730827cb3b902a..2a32d9ca855035a3e2257cf08fb4a83f7f3fddc5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
@@ -1570,6 +1570,13 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
         return null;
     }
 
+    @Override
+    public Metaproject getMetaproject(String sessionToken, IMetaprojectId metaprojectId)
+    {
+        logAccess(sessionToken, "getMetaproject", "METAPROJECT_ID(%s)", metaprojectId);
+        return null;
+    }
+
     @Override
     public MetaprojectAssignments getMetaprojectAssignments(String sessionToken,
             IMetaprojectId metaprojectId)
@@ -1607,11 +1614,19 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     }
 
     @Override
-    public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId)
+    public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId, String reason)
     {
         logAccess(sessionToken, "deleteMetaproject", "METAPROJECT_ID(%s)", metaprojectId);
     }
 
+    @Override
+    public void deleteMetaprojects(String sessionToken, List<IMetaprojectId> metaprojectIds,
+            String reason)
+    {
+        logTracking(sessionToken, "deleteMetaprojects", "METAPROJECT_IDS(%s) REASON(%s)",
+                abbreviate(metaprojectIds), reason);
+    }
+
     @Override
     public Metaproject registerMetaproject(String sessionToken, String name,
             String descriptionOrNull)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java
index c0d257869c9e69e63dd2e6e094bb8a3705c5c807..5605bdf6b3c3a82990b7976c255fb62ebaa5af40 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationChangingService.java
@@ -167,7 +167,7 @@ public class GeneralInformationChangingService extends
     @RolesAllowed(RoleWithHierarchy.SPACE_USER)
     public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId)
     {
-        server.deleteMetaproject(sessionToken, metaprojectId);
+        server.deleteMetaproject(sessionToken, metaprojectId, null);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMetaprojectBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMetaprojectBO.java
index f75ead62eeb39cb1ca0ca42cc429cd0f97ed004a..cd3949983ef0f644ae29f8ba885fcdc639f98fb9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMetaprojectBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IMetaprojectBO.java
@@ -56,7 +56,8 @@ public interface IMetaprojectBO extends IEntityBusinessObject
 
     void removeMaterials(List<? extends IMaterialId> materials);
 
-    void deleteByMetaprojectId(IMetaprojectId metaprojectId) throws UserFailureException;
+    void deleteByMetaprojectId(IMetaprojectId metaprojectId, String reason)
+            throws UserFailureException;
 
     MetaprojectPE getMetaproject();
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MetaprojectBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MetaprojectBO.java
index 99d4d9d83e25f6e56d02b11f8ecb12d0894db243..8a2c7e941c5fa6624997aa830aeecb0e35175049 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MetaprojectBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/MetaprojectBO.java
@@ -216,15 +216,17 @@ public class MetaprojectBO extends AbstractBusinessObject implements IMetaprojec
     }
 
     @Override
-    public void deleteByMetaprojectId(IMetaprojectId metaprojectId) throws UserFailureException
+    public void deleteByMetaprojectId(IMetaprojectId metaprojectId, String reason)
+            throws UserFailureException
     {
         loadByMetaprojectId(metaprojectId);
 
         getMetaprojectDAO().delete(metaproject);
-        getEventDAO().persist(createDeletionEvent(metaproject, session.tryGetPerson()));
+        getEventDAO().persist(createDeletionEvent(metaproject, session.tryGetPerson(), reason));
     }
 
-    private static EventPE createDeletionEvent(MetaprojectPE metaproject, PersonPE registrator)
+    private static EventPE createDeletionEvent(MetaprojectPE metaproject, PersonPE registrator,
+            String reason)
     {
         EventPE event = new EventPE();
         event.setEventType(EventType.DELETION);
@@ -232,6 +234,7 @@ public class MetaprojectBO extends AbstractBusinessObject implements IMetaprojec
         event.setIdentifiers(Collections.singletonList(metaproject.getName()));
         event.setDescription(metaproject.getName());
         event.setRegistrator(registrator);
+        event.setReason(reason);
 
         return event;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
index 18a51b259393de3a0cb0cd0b4b08d7d724d2da24..eb03705d23647ecaa11239ee216d5fc1a9c0a5da 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
@@ -1440,6 +1440,12 @@ public interface ICommonServer extends IServer
     public MetaprojectAssignments getMetaprojectAssignments(String sessionToken,
             IMetaprojectId metaprojectId, EnumSet<MetaprojectAssignmentsFetchOption> fetchOptions);
 
+    /**
+     * Returns metaproject.
+     */
+    @Transactional(readOnly = true)
+    public Metaproject getMetaproject(String sessionToken, IMetaprojectId metaprojectId);
+
     /**
      * Adds specified entities to given metaproject.
      */
@@ -1461,7 +1467,15 @@ public interface ICommonServer extends IServer
      */
     @Transactional
     @DatabaseCreateOrDeleteModification(value = ObjectKind.METAPROJECT)
-    public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId);
+    public void deleteMetaproject(String sessionToken, IMetaprojectId metaprojectId, String reason);
+
+    /**
+     * Deletes given metaprojects.
+     */
+    @Transactional
+    @DatabaseCreateOrDeleteModification(value = ObjectKind.METAPROJECT)
+    public void deleteMetaprojects(String sessionToken, List<IMetaprojectId> metaprojectIds,
+            String reason);
 
     /**
      * Registers a new metaproject.
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 997a90e93cc62718dcfd457a8b02a57c7bc1859d..5fd1bd3f3c9829b88858d52fe895a1aa06f34056 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
@@ -60,6 +60,7 @@ var common = {
   add_unofficial_vocabulary_term_dialog_title: "Add Ad Hoc Term",
   breadcrumbs_separator: "»",
   storage_confirmation: "Storage Confirmed",
+  metaproject: "Metaproject",
   metaprojects: "Metaprojects",
   metaprojects_hint: "List of metaprojects names separated by commas (\",\") or one metaproject name per line.",
   add_metaproject: "Add Metaproject...",
@@ -179,6 +180,7 @@ var common = {
   button_delete_material: "Delete Material",
   button_delete_data_set: "Delete Data Set",
   button_delete_project: "Delete Project",
+  button_delete_metaproject: "Delete Metaproject",
   button_configure: "Settings",  
   button_filters: "Filters",  
   button_upload_data_via_cifex: "Upload Data",
diff --git a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Metaproject.java b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Metaproject.java
index 67f4ac183dd38af9a4b5468fe2240d04968fb39f..145b93430806713760c8b09e30e808eb93acd41e 100644
--- a/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Metaproject.java
+++ b/openbis_api/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Metaproject.java
@@ -20,13 +20,13 @@ import java.io.Serializable;
 import java.util.Date;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
-import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 
 /**
  * @author Pawel Glyzewski
  */
 @JsonObject("Metaproject")
-public class Metaproject implements Serializable, IIdHolder
+public class Metaproject implements Serializable, IIdAndCodeHolder
 {
     private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
@@ -72,6 +72,12 @@ public class Metaproject implements Serializable, IIdHolder
         }
     }
 
+    @Override
+    public String getCode()
+    {
+        return getName();
+    }
+
     public String getName()
     {
         return name;