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 dae04eaa621ee3f1e706c7c29c4f4ea7989685e6..cc95e89a67619e128e79b7a1170c3e616e72b175 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
@@ -903,6 +903,8 @@ public abstract class Dict
     public static final String DELETE_CONFIRMATION_MESSAGE_WITH_REASON =
             "delete_confirmation_message_with_reason";
 
+    public static final String DELETE_PROGRESS_MESSAGE = "delete_progress_message";
+
     public static final String DELETE_CONFIRMATION_WARNING = "delete_confirmation_warning";
 
     public static final String DELETE_CONFIRMATION_WARNING_PART_FOR_EXPERIMENT =
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AuthorizationGroupGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AuthorizationGroupGrid.java
index 72a28b56b0c1821bc04280993e9924e98a728a2d..e7340ae3ad41fb59021040a9a84c6f2cebaec371 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AuthorizationGroupGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/AuthorizationGroupGrid.java
@@ -256,22 +256,19 @@ public class AuthorizationGroupGrid extends AbstractSimpleBrowserGrid<Authorizat
 
         private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-        private final AbstractAsyncCallback<Void> callback;
-
         public GroupListDeletionConfirmationDialog(
                 IViewContext<ICommonClientServiceAsync> viewContext, List<AuthorizationGroup> data,
                 AbstractAsyncCallback<Void> callback)
         {
-            super(viewContext, data);
+            super(viewContext, data, callback);
             this.viewContext = viewContext;
-            this.callback = callback;
         }
 
         @Override
-        protected void executeConfirmedAction()
+        protected void executeDeletion(AsyncCallback<Void> deletionCallback)
         {
             viewContext.getCommonService().deleteAuthorizationGroups(TechId.createList(data),
-                    reason.getValue(), callback);
+                    reason.getValue(), deletionCallback);
         }
 
         @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/SpaceGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/SpaceGrid.java
index 7f86d3561bf3a4ca68a51c719e2e727d5c2466d0..30da2c3e0ef95bbe6d0432482f46b4fec9fd1773 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/SpaceGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/SpaceGrid.java
@@ -216,28 +216,24 @@ public class SpaceGrid extends TypedTableGrid<Space>
 
         private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-        private final AbstractAsyncCallback<Void> callback;
-
         public GroupListDeletionConfirmationDialog(
                 IViewContext<ICommonClientServiceAsync> viewContext,
                 List<TableModelRowWithObject<Space>> data, AbstractAsyncCallback<Void> callback)
         {
-            super(viewContext, data);
+            super(viewContext, data, callback);
             this.viewContext = viewContext;
-            this.callback = callback;
         }
 
         @Override
-        protected void executeConfirmedAction()
+        protected void executeDeletion(AsyncCallback<Void> deletionCallback)
         {
-
             List<TableModelRowWithObject<Space>> d = data;
             List<TechId> list = new ArrayList<TechId>();
             for (TableModelRowWithObject<Space> tableModelRowWithObject : d)
             {
                 list.add(new TechId(tableModelRowWithObject.getObjectOrNull().getId()));
             }
-            viewContext.getCommonService().deleteGroups(list, reason.getValue(), callback);
+            viewContext.getCommonService().deleteGroups(list, reason.getValue(), deletionCallback);
         }
 
         @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/attachment/AttachmentListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/attachment/AttachmentListDeletionConfirmationDialog.java
index 25df17b09a86ce1c34fece3ed06b7f3c7db7d459..33b62b5505fb6c6cfbd59a1c777d94abdbb8b3c2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/attachment/AttachmentListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/attachment/AttachmentListDeletionConfirmationDialog.java
@@ -19,6 +19,8 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.attach
 import java.util.ArrayList;
 import java.util.List;
 
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
 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;
@@ -34,8 +36,6 @@ public final class AttachmentListDeletionConfirmationDialog extends
 
     private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-    private final AbstractAsyncCallback<Void> callback;
-
     private final IAttachmentHolder attachmentHolder;
 
     public AttachmentListDeletionConfirmationDialog(
@@ -43,18 +43,17 @@ public final class AttachmentListDeletionConfirmationDialog extends
             List<AttachmentVersions> attachments, AbstractAsyncCallback<Void> callback,
             IAttachmentHolder attachmentHolder)
     {
-        super(viewContext, attachments);
+        super(viewContext, attachments, callback);
         this.viewContext = viewContext;
-        this.callback = callback;
         this.attachmentHolder = attachmentHolder;
     }
 
     @Override
-    protected void executeConfirmedAction()
+    protected void executeDeletion(AsyncCallback<Void> deletionCallback)
     {
         viewContext.getCommonService().deleteAttachments(TechId.create(attachmentHolder),
                 attachmentHolder.getAttachmentHolderKind(), getAttachmentFileNames(data),
-                reason.getValue(), callback);
+                reason.getValue(), deletionCallback);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
index e9e489ee1077a0e0dcbfb174049ed18f751c2d66..be54ef69a9066feb15bd09ac9aab4756293ff663 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data;
 import java.util.Collections;
 
 import com.extjs.gxt.ui.client.widget.form.RadioGroup;
+import com.google.gwt.user.client.rpc.AsyncCallback;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
@@ -37,8 +38,6 @@ public final class DataSetListDeletionConfirmationDialog extends
 
     private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-    private final AbstractAsyncCallback<Void> callback;
-
     private final SelectedAndDisplayedItems selectedAndDisplayedItemsOrNull;
 
     private final ExternalData singleData;
@@ -48,9 +47,8 @@ public final class DataSetListDeletionConfirmationDialog extends
             AbstractAsyncCallback<Void> callback,
             SelectedAndDisplayedItems selectedAndDisplayedItems)
     {
-        super(viewContext, selectedAndDisplayedItems.getSelectedItems(), true);
+        super(viewContext, selectedAndDisplayedItems.getSelectedItems(), callback, true);
         this.viewContext = viewContext;
-        this.callback = callback;
         this.singleData = null;
         this.selectedAndDisplayedItemsOrNull = selectedAndDisplayedItems;
     }
@@ -59,26 +57,25 @@ public final class DataSetListDeletionConfirmationDialog extends
             IViewContext<ICommonClientServiceAsync> viewContext, ExternalData data,
             AbstractAsyncCallback<Void> callback)
     {
-        super(viewContext, Collections.singletonList(data), false);
+        super(viewContext, Collections.singletonList(data), callback, false);
         this.viewContext = viewContext;
-        this.callback = callback;
         this.singleData = data;
         this.selectedAndDisplayedItemsOrNull = null;
     }
 
     @Override
-    protected void executeConfirmedAction()
+    protected void executeDeletion(AsyncCallback<Void> deletionCallback)
     {
         if (selectedAndDisplayedItemsOrNull != null)
         {
             final DisplayedOrSelectedDatasetCriteria uploadCriteria =
                     selectedAndDisplayedItemsOrNull.createCriteria(isOnlySelected());
             viewContext.getCommonService().deleteDataSets(uploadCriteria, reason.getValue(),
-                    callback);
+                    deletionCallback);
         } else
         {
             viewContext.getCommonService().deleteDataSet(singleData.getCode(), reason.getValue(),
-                    callback);
+                    deletionCallback);
         }
     }
 
@@ -91,10 +88,11 @@ public final class DataSetListDeletionConfirmationDialog extends
     @Override
     protected final RadioGroup createRadio()
     {
-        return WidgetUtils.createAllOrSelectedRadioGroup(onlySelectedRadioOrNull =
-                WidgetUtils.createRadio(viewContext.getMessage(Dict.ONLY_SELECTED_RADIO, data
-                        .size())), WidgetUtils.createRadio(viewContext.getMessage(Dict.ALL_RADIO,
-                selectedAndDisplayedItemsOrNull.getDisplayedItemsCount())), viewContext
-                .getMessage(Dict.DATA_SETS_RADIO_GROUP_LABEL), data.size());
+        return WidgetUtils.createAllOrSelectedRadioGroup(
+                onlySelectedRadioOrNull =
+                        WidgetUtils.createRadio(viewContext.getMessage(Dict.ONLY_SELECTED_RADIO,
+                                data.size())), WidgetUtils.createRadio(viewContext.getMessage(
+                        Dict.ALL_RADIO, selectedAndDisplayedItemsOrNull.getDisplayedItemsCount())),
+                viewContext.getMessage(Dict.DATA_SETS_RADIO_GROUP_LABEL), data.size());
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java
index 7f72ffdc21e52d508b6a6f3f0f4f4f0b6d690010..d415e7e26d3182f6e5043c7d3bc73f3c2a291e56 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/experiment/ExperimentListDeletionConfirmationDialog.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.experi
 import java.util.Collections;
 
 import com.extjs.gxt.ui.client.widget.form.RadioGroup;
+import com.google.gwt.user.client.rpc.AsyncCallback;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
@@ -38,8 +39,6 @@ public final class ExperimentListDeletionConfirmationDialog extends
 
     private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-    private final AbstractAsyncCallback<Void> callback;
-
     private final DisplayedAndSelectedExperiments selectedAndDisplayedItemsOrNull;
 
     private final Experiment singleDataOrNull;
@@ -49,9 +48,8 @@ public final class ExperimentListDeletionConfirmationDialog extends
             AbstractAsyncCallback<Void> callback,
             DisplayedAndSelectedExperiments selectedAndDisplayedItems)
     {
-        super(viewContext, selectedAndDisplayedItems.getSelectedItems(), true);
+        super(viewContext, selectedAndDisplayedItems.getSelectedItems(), callback, true);
         this.viewContext = viewContext;
-        this.callback = callback;
         this.singleDataOrNull = null;
         this.selectedAndDisplayedItemsOrNull = selectedAndDisplayedItems;
     }
@@ -60,26 +58,25 @@ public final class ExperimentListDeletionConfirmationDialog extends
             IViewContext<ICommonClientServiceAsync> viewContext,
             AbstractAsyncCallback<Void> callback, Experiment experiment)
     {
-        super(viewContext, Collections.singletonList(experiment), false);
+        super(viewContext, Collections.singletonList(experiment), callback, false);
         this.viewContext = viewContext;
-        this.callback = callback;
         this.singleDataOrNull = experiment;
         this.selectedAndDisplayedItemsOrNull = null;
     }
 
     @Override
-    protected void executeConfirmedAction()
+    protected void executeDeletion(AsyncCallback<Void> deletionCallback)
     {
         if (selectedAndDisplayedItemsOrNull != null)
         {
             final DisplayedOrSelectedIdHolderCriteria<Experiment> uploadCriteria =
                     selectedAndDisplayedItemsOrNull.createCriteria(isOnlySelected());
             viewContext.getCommonService().deleteExperiments(uploadCriteria, reason.getValue(),
-                    callback);
+                    deletionCallback);
         } else
         {
             viewContext.getCommonService().deleteExperiment(TechId.create(singleDataOrNull),
-                    reason.getValue(), callback);
+                    reason.getValue(), deletionCallback);
         }
     }
 
@@ -92,11 +89,12 @@ public final class ExperimentListDeletionConfirmationDialog extends
     @Override
     protected final RadioGroup createRadio()
     {
-        return WidgetUtils.createAllOrSelectedRadioGroup(onlySelectedRadioOrNull =
-                WidgetUtils.createRadio(viewContext.getMessage(Dict.ONLY_SELECTED_RADIO, data
-                        .size())), WidgetUtils.createRadio(viewContext.getMessage(Dict.ALL_RADIO,
-                selectedAndDisplayedItemsOrNull.getDisplayedItemsCount())), viewContext
-                .getMessage(Dict.EXPERIMENTS_RADIO_GROUP_LABEL), data.size());
+        return WidgetUtils.createAllOrSelectedRadioGroup(
+                onlySelectedRadioOrNull =
+                        WidgetUtils.createRadio(viewContext.getMessage(Dict.ONLY_SELECTED_RADIO,
+                                data.size())), WidgetUtils.createRadio(viewContext.getMessage(
+                        Dict.ALL_RADIO, selectedAndDisplayedItemsOrNull.getDisplayedItemsCount())),
+                viewContext.getMessage(Dict.EXPERIMENTS_RADIO_GROUP_LABEL), data.size());
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialListDeletionConfirmationDialog.java
index ee52caef1417d6580c322e7b0079ee107a2d9e55..6247e4ee4904385fa7f8353cbad8bdc1ece86d9c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/material/MaterialListDeletionConfirmationDialog.java
@@ -19,10 +19,10 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.materi
 import java.util.List;
 
 import com.extjs.gxt.ui.client.widget.form.RadioGroup;
+import com.google.gwt.user.client.rpc.AsyncCallback;
 
 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.AsyncCallbackWithProgressBar;
 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.material.MaterialBrowserGrid.DisplayedAndSelectedMaterials;
@@ -38,8 +38,6 @@ public final class MaterialListDeletionConfirmationDialog extends
 
     private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-    private final AbstractAsyncCallback<Void> callback;
-
     private final DisplayedAndSelectedMaterials selectedAndDisplayedItems;
 
     public MaterialListDeletionConfirmationDialog(
@@ -47,20 +45,18 @@ public final class MaterialListDeletionConfirmationDialog extends
             AbstractAsyncCallback<Void> callback,
             DisplayedAndSelectedMaterials selectedAndDisplayedItems)
     {
-        super(viewContext, data, true);
+        super(viewContext, data, callback, true);
         this.viewContext = viewContext;
-        this.callback = callback;
         this.selectedAndDisplayedItems = selectedAndDisplayedItems;
     }
 
     @Override
-    protected void executeConfirmedAction()
+    protected void executeDeletion(AsyncCallback<Void> deletionCallback)
     {
         final DisplayedOrSelectedIdHolderCriteria<Material> uploadCriteria =
                 selectedAndDisplayedItems.createCriteria(isOnlySelected());
         viewContext.getCommonService().deleteMaterials(uploadCriteria, reason.getValue(),
-                AsyncCallbackWithProgressBar.decorate(callback, "Deleting materials..."));
-
+                deletionCallback);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/project/ProjectListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/project/ProjectListDeletionConfirmationDialog.java
index 00e2bfdf113489f0bbb0c38bba8f25841573e00d..3eaf5009b38903e19058d6a00e285791df24d85d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/project/ProjectListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/project/ProjectListDeletionConfirmationDialog.java
@@ -19,6 +19,8 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.projec
 import java.util.Collections;
 import java.util.List;
 
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
 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;
@@ -33,15 +35,12 @@ public final class ProjectListDeletionConfirmationDialog extends
 
     private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-    private final AbstractAsyncCallback<Void> callback;
-
     public ProjectListDeletionConfirmationDialog(
             IViewContext<ICommonClientServiceAsync> viewContext, List<Project> data,
             AbstractAsyncCallback<Void> callback)
     {
-        super(viewContext, data);
+        super(viewContext, data, callback);
         this.viewContext = viewContext;
-        this.callback = callback;
     }
 
     public ProjectListDeletionConfirmationDialog(
@@ -52,10 +51,10 @@ public final class ProjectListDeletionConfirmationDialog extends
     }
 
     @Override
-    protected void executeConfirmedAction()
+    protected void executeDeletion(AsyncCallback<Void> deletionCallback)
     {
         viewContext.getCommonService().deleteProjects(TechId.createList(data), reason.getValue(),
-                callback);
+                deletionCallback);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/property_type/PropertyTypeListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/property_type/PropertyTypeListDeletionConfirmationDialog.java
index 51503c322aa17ee0e39cb9fe6fb15aec3df126e2..eee9b9b4d1e090700868632cb1309b03be37ed62 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/property_type/PropertyTypeListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/property_type/PropertyTypeListDeletionConfirmationDialog.java
@@ -18,6 +18,8 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.proper
 
 import java.util.List;
 
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
 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;
@@ -32,22 +34,19 @@ public final class PropertyTypeListDeletionConfirmationDialog extends
 
     private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-    private final AbstractAsyncCallback<Void> callback;
-
     public PropertyTypeListDeletionConfirmationDialog(
             IViewContext<ICommonClientServiceAsync> viewContext, List<PropertyType> propertyTypes,
             AbstractAsyncCallback<Void> callback)
     {
-        super(viewContext, propertyTypes);
+        super(viewContext, propertyTypes, callback);
         this.viewContext = viewContext;
-        this.callback = callback;
     }
 
     @Override
-    protected void executeConfirmedAction()
+    protected void executeDeletion(AsyncCallback<Void> deletionCallback)
     {
         viewContext.getCommonService().deletePropertyTypes(TechId.createList(data),
-                reason.getValue(), callback);
+                reason.getValue(), deletionCallback);
     }
 
     @Override
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 2a2b24c3c94af97b58b3a22baf0fd3528779ffe2..7b7a5f0dc91c3629133351246439d71c13e1dcb8 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
@@ -88,7 +88,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject
 
 /**
  * Grid showing {@link Sample} instances.
- *
+ * 
  * @author Franz-Josef Elmer
  */
 public class SampleBrowserGrid extends TypedTableGrid<Sample>
@@ -123,8 +123,8 @@ public class SampleBrowserGrid extends TypedTableGrid<Sample>
                         DisplayTypeIDGenerator.ENTITY_BROWSER_GRID)
                     {
                         @Override
-                        protected void showEntityViewer(TableModelRowWithObject<Sample> row, boolean editMode,
-                                boolean active)
+                        protected void showEntityViewer(TableModelRowWithObject<Sample> row,
+                                boolean editMode, boolean active)
                         {
                             // do nothing - avoid showing the details after double click
                         }
@@ -336,10 +336,12 @@ public class SampleBrowserGrid extends TypedTableGrid<Sample>
     public String getGridDisplayTypeID()
     {
         ListSampleDisplayCriteria criteria = getCriteriaProvider().tryGetCriteria();
-        String suffix = createDisplayIdSuffix(EntityKind.SAMPLE, criteria == null ? null : criteria.tryGetSampleType());
+        String suffix =
+                createDisplayIdSuffix(EntityKind.SAMPLE,
+                        criteria == null ? null : criteria.tryGetSampleType());
         return createGridDisplayTypeID(suffix);
     }
-    
+
     private static String createDisplayIdSuffix(EntityKind entityKindOrNull,
             EntityType entityTypeOrNull)
     {
@@ -354,7 +356,7 @@ public class SampleBrowserGrid extends TypedTableGrid<Sample>
         }
         return suffix;
     }
-    
+
     private void linkSample()
     {
         ICellListenerAndLinkGenerator<Sample> listenerLinkGenerator =
@@ -363,7 +365,8 @@ public class SampleBrowserGrid extends TypedTableGrid<Sample>
                         public void handle(TableModelRowWithObject<Sample> rowItem,
                                 boolean specialKeyPressed)
                         {
-                            showEntityInformationHolderViewer(rowItem.getObjectOrNull(), false, specialKeyPressed);
+                            showEntityInformationHolderViewer(rowItem.getObjectOrNull(), false,
+                                    specialKeyPressed);
                         }
 
                         public String tryGetLink(Sample entity,
@@ -401,7 +404,7 @@ public class SampleBrowserGrid extends TypedTableGrid<Sample>
         registerListenerAndLinkGenerator(SampleGridColumnIDs.EXPERIMENT_IDENTIFIER,
                 listenerLinkGenerator);
     }
-    
+
     private void linkProject()
     {
         registerListenerAndLinkGenerator(SampleGridColumnIDs.PROJECT,
@@ -467,8 +470,8 @@ public class SampleBrowserGrid extends TypedTableGrid<Sample>
                         public void handle(TableModelRowWithObject<Sample> rowItem,
                                 boolean specialKeyPressed)
                         {
-                            showEntityInformationHolderViewer(rowItem.getObjectOrNull().getContainer(), false,
-                                    specialKeyPressed);
+                            showEntityInformationHolderViewer(rowItem.getObjectOrNull()
+                                    .getContainer(), false, specialKeyPressed);
                         }
 
                         public String tryGetLink(Sample entity,
@@ -480,8 +483,6 @@ public class SampleBrowserGrid extends TypedTableGrid<Sample>
                     });
     }
 
-    
-
     @Override
     protected GridCellRenderer<BaseEntityModel<?>> createInternalLinkCellRenderer()
     {
@@ -516,7 +517,8 @@ public class SampleBrowserGrid extends TypedTableGrid<Sample>
     @Override
     protected List<String> getColumnIdsOfFilters()
     {
-        return Arrays.asList(SampleGridColumnIDs.CODE, SampleGridColumnIDs.EXPERIMENT, SampleGridColumnIDs.PROJECT);
+        return Arrays.asList(SampleGridColumnIDs.CODE, SampleGridColumnIDs.EXPERIMENT,
+                SampleGridColumnIDs.PROJECT);
     }
 
     @Override
@@ -661,7 +663,7 @@ public class SampleBrowserGrid extends TypedTableGrid<Sample>
                 protected Dialog createDialog(List<TableModelRowWithObject<Sample>> samples,
                         IBrowserGridActionInvoker invoker)
                 {
-                    AsyncCallback<Void> callback = createRefreshCallback(invoker);
+                    AbstractAsyncCallback<Void> callback = createRefreshCallback(invoker);
                     DisplayedAndSelectedEntities<TableModelRowWithObject<Sample>> s =
                             getDisplayedAndSelectedItemsAction().execute();
                     return new SampleListDeletionConfirmationDialog<TableModelRowWithObject<Sample>>(
@@ -681,12 +683,14 @@ public class SampleBrowserGrid extends TypedTableGrid<Sample>
                 {
                     TableExportCriteria<TableModelRowWithObject<Sample>> tableExportCriteria =
                             createTableExportCriteria();
-                    List<TableModelRowWithObject<Sample>> selectedBaseObjects = getSelectedBaseObjects();
-                    return new DisplayedAndSelectedEntities<TableModelRowWithObject<Sample>>(selectedBaseObjects,
-                            tableExportCriteria, getTotalCount());
+                    List<TableModelRowWithObject<Sample>> selectedBaseObjects =
+                            getSelectedBaseObjects();
+                    return new DisplayedAndSelectedEntities<TableModelRowWithObject<Sample>>(
+                            selectedBaseObjects, tableExportCriteria, getTotalCount());
                 }
             };
     }
+
     public static final String createChildComponentId(final String browserId,
             final String childSuffix)
     {
@@ -741,11 +745,12 @@ public class SampleBrowserGrid extends TypedTableGrid<Sample>
     }
 
     @Override
-    protected void showEntityViewer(TableModelRowWithObject<Sample> row, boolean editMode, boolean inBackground)
+    protected void showEntityViewer(TableModelRowWithObject<Sample> row, boolean editMode,
+            boolean inBackground)
     {
         showEntityInformationHolderViewer(row.getObjectOrNull(), editMode, inBackground);
     }
-    
+
     protected final IDelegatedAction createGridRefreshDelegatedAction()
     {
         return new IDelegatedAction()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleListDeletionConfirmationDialog.java
index 3a626917cbedf642c9b40b3ec6293716d4f4389a..a47523b484e1bd97f7d7c165d52dacd7cfeb5fc1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleListDeletionConfirmationDialog.java
@@ -24,7 +24,6 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
 
 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.AsyncCallbackWithProgressBar;
 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.DisplayedAndSelectedEntities;
@@ -41,19 +40,17 @@ public final class SampleListDeletionConfirmationDialog<T extends IIdHolder> ext
 
     private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-    private final AsyncCallback<Void> callback;
-
     private final DisplayedAndSelectedEntities<T> selectedAndDisplayedItemsOrNull;
 
     private final T singleDataOrNull;
 
     public SampleListDeletionConfirmationDialog(
             IViewContext<ICommonClientServiceAsync> viewContext, List<T> data,
-            AsyncCallback<Void> callback, DisplayedAndSelectedEntities<T> selectedAndDisplayedItems)
+            AbstractAsyncCallback<Void> callback,
+            DisplayedAndSelectedEntities<T> selectedAndDisplayedItems)
     {
-        super(viewContext, data, true);
+        super(viewContext, data, callback, true);
         this.viewContext = viewContext;
-        this.callback = callback;
         this.singleDataOrNull = null;
         this.selectedAndDisplayedItemsOrNull = selectedAndDisplayedItems;
     }
@@ -62,28 +59,25 @@ public final class SampleListDeletionConfirmationDialog<T extends IIdHolder> ext
             IViewContext<ICommonClientServiceAsync> viewContext, List<T> data,
             AbstractAsyncCallback<Void> callback, T sample)
     {
-        super(viewContext, data, false);
+        super(viewContext, data, callback, false);
         this.viewContext = viewContext;
-        this.callback = callback;
         this.singleDataOrNull = sample;
         this.selectedAndDisplayedItemsOrNull = null;
     }
 
     @Override
-    protected void executeConfirmedAction()
+    protected void executeDeletion(AsyncCallback<Void> deletionCallback)
     {
-        AsyncCallback<Void> callbackWithProgressBar =
-                AsyncCallbackWithProgressBar.decorate(callback, "Deleting samples...");
         if (selectedAndDisplayedItemsOrNull != null)
         {
             final DisplayedOrSelectedIdHolderCriteria<T> uploadCriteria =
                     selectedAndDisplayedItemsOrNull.createCriteria(isOnlySelected());
             viewContext.getCommonService().deleteSamples(uploadCriteria, reason.getValue(),
-                    callbackWithProgressBar);
+                    deletionCallback);
         } else
         {
             viewContext.getCommonService().deleteSample(TechId.create(singleDataOrNull),
-                    reason.getValue(), callbackWithProgressBar);
+                    reason.getValue(), deletionCallback);
         }
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptGrid.java
index b1a18918ca411d74393556a0df713b4980b38c0b..3a391cef529f47ccab205fd29eaad9361fe8268e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/script/ScriptGrid.java
@@ -253,21 +253,18 @@ public class ScriptGrid extends TypedTableGrid<Script>
 
         private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-        private final AbstractAsyncCallback<Void> callback;
-
         public ScriptListDeletionConfirmationDialog(
                 IViewContext<ICommonClientServiceAsync> viewContext,
                 List<TableModelRowWithObject<Script>> data, AbstractAsyncCallback<Void> callback)
         {
-            super(viewContext, data);
+            super(viewContext, data, callback);
             this.viewContext = viewContext;
-            this.callback = callback;
         }
 
         @Override
-        protected void executeConfirmedAction()
+        protected void executeDeletion(AsyncCallback<Void> deletionCallback)
         {
-            viewContext.getCommonService().deleteScripts(TechId.createList(data), callback);
+            viewContext.getCommonService().deleteScripts(TechId.createList(data), deletionCallback);
         }
 
         @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/vocabulary/VocabularyListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/vocabulary/VocabularyListDeletionConfirmationDialog.java
index 08e3d0e09d91185b83b8fa5ce17a2184030a706a..509104da0fa4ba7c3fca9e023fff4cdddc848a9f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/vocabulary/VocabularyListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/vocabulary/VocabularyListDeletionConfirmationDialog.java
@@ -18,6 +18,8 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.vocabu
 
 import java.util.List;
 
+import com.google.gwt.user.client.rpc.AsyncCallback;
+
 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;
@@ -33,23 +35,20 @@ public final class VocabularyListDeletionConfirmationDialog extends
 
     private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-    private final AbstractAsyncCallback<Void> callback;
-
     public VocabularyListDeletionConfirmationDialog(
             IViewContext<ICommonClientServiceAsync> viewContext,
             List<TableModelRowWithObject<Vocabulary>> vocabularies,
             AbstractAsyncCallback<Void> callback)
     {
-        super(viewContext, vocabularies);
+        super(viewContext, vocabularies, callback);
         this.viewContext = viewContext;
-        this.callback = callback;
     }
 
     @Override
-    protected void executeConfirmedAction()
+    protected void executeDeletion(AsyncCallback<Void> deletionCallback)
     {
         viewContext.getCommonService().deleteVocabularies(TechId.createList(data),
-                reason.getValue(), callback);
+                reason.getValue(), deletionCallback);
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListDeletionConfirmationDialog.java
index d25b72e4284e6124041dd97918781dcd5c6f5c0e..3ec09058d73f4440cf0291bbdf43b644dfeb551c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/widget/AbstractDataListDeletionConfirmationDialog.java
@@ -20,7 +20,10 @@ import java.util.List;
 
 import com.extjs.gxt.ui.client.widget.form.Radio;
 import com.extjs.gxt.ui.client.widget.form.RadioGroup;
+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.AsyncCallbackWithProgressBar;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ReasonField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
@@ -43,6 +46,8 @@ public abstract class AbstractDataListDeletionConfirmationDialog<T> extends
 
     private static final String SELECTED = " selected ";
 
+    private final AbstractAsyncCallback<Void> callback;
+
     private final boolean withRadio;
 
     protected Radio onlySelectedRadioOrNull;
@@ -50,16 +55,18 @@ public abstract class AbstractDataListDeletionConfirmationDialog<T> extends
     protected ReasonField reason;
 
     public AbstractDataListDeletionConfirmationDialog(IMessageProvider messageProvider,
-            List<T> data, boolean withRadio)
+            List<T> data, AbstractAsyncCallback<Void> callback, boolean withRadio)
     {
         super(messageProvider, data, messageProvider.getMessage(Dict.DELETE_CONFIRMATION_TITLE));
+        this.callback = callback;
         this.withRadio = withRadio;
     }
 
     // without radio
-    public AbstractDataListDeletionConfirmationDialog(IMessageProvider messageProvider, List<T> data)
+    public AbstractDataListDeletionConfirmationDialog(IMessageProvider messageProvider,
+            List<T> data, AbstractAsyncCallback<Void> callback)
     {
-        this(messageProvider, data, false);
+        this(messageProvider, data, callback, false);
     }
 
     @Override
@@ -96,6 +103,14 @@ public abstract class AbstractDataListDeletionConfirmationDialog<T> extends
 
     protected abstract String getEntityName();
 
+    protected abstract void executeDeletion(AsyncCallback<Void> deletionCallback);
+
+    @Override
+    protected final void executeConfirmedAction()
+    {
+        executeDeletion(getCallbackWithProgressBar());
+    }
+
     /**
      * This method should be overriden in subclasses if dialog is supposed to use a radio and set
      * {@link #onlySelectedRadioOrNull}.
@@ -109,4 +124,14 @@ public abstract class AbstractDataListDeletionConfirmationDialog<T> extends
     {
         return WidgetUtils.isSelected(onlySelectedRadioOrNull);
     }
+
+    /**
+     * Returns deletion callback and shows a progress bar that will be hidden when the callback is
+     * finished.
+     */
+    private AsyncCallback<Void> getCallbackWithProgressBar()
+    {
+        return AsyncCallbackWithProgressBar.decorate(callback,
+                messageProvider.getMessage(Dict.DELETE_PROGRESS_MESSAGE, getEntityName()));
+    }
 }
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 97f809d2dea636f6a121a632a57dc883b60d2630..fc0341024d631cdfae68a24d6b380c45e9658057 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
@@ -42,6 +42,7 @@ var common = {
   url: "URL",
   reason: "Reason",
   delete_confirmation_message_with_reason: "You are deleting {0}(s).<br><br>Please enter a reason or cancel deletion.",
+  delete_progress_message: "Deleting {0}(s)...",
   add_attachment: "Add attachment...",
   data_view: "Data View",
   main_data_set_path: "Main Data Set Path",
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/SampleAbundanceBrowserGrid.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/SampleAbundanceBrowserGrid.java
index 00f6c0878582b8d74c66a31667870219f326428b..103df9e2aee84f13a78a27ce7cc6ebfd96266dfa 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/SampleAbundanceBrowserGrid.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/client/application/SampleAbundanceBrowserGrid.java
@@ -22,6 +22,7 @@ import java.util.Set;
 import com.extjs.gxt.ui.client.widget.Dialog;
 import com.extjs.gxt.ui.client.widget.LayoutContainer;
 import com.extjs.gxt.ui.client.widget.button.Button;
+import com.google.gwt.user.client.rpc.AsyncCallback;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
@@ -227,22 +228,19 @@ public class SampleAbundanceBrowserGrid
 
         private final IViewContext<ICommonClientServiceAsync> viewContext;
 
-        private final AbstractAsyncCallback<Void> callback;
-
         public SampleListDeletionConfirmationDialog(
                 IViewContext<ICommonClientServiceAsync> viewContext,
                 List<SampleWithPropertiesAndAbundance> data, AbstractAsyncCallback<Void> callback)
         {
-            super(viewContext, data);
+            super(viewContext, data, callback);
             this.viewContext = viewContext;
-            this.callback = callback;
         }
 
         @Override
-        protected void executeConfirmedAction()
+        protected void executeDeletion(AsyncCallback<Void> deletionCallback)
         {
             viewContext.getCommonService().deleteSamples(TechId.createList(data),
-                    reason.getValue(), callback);
+                    reason.getValue(), deletionCallback);
         }
 
         @Override