diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerDialog.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerDialog.java
index dc7a13f83788e55aa8a99704cd3d55198e298257..39617de26e8ebfa8ded3bdec2d0ce0a54b84eb19 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerDialog.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerDialog.java
@@ -16,27 +16,122 @@
 
 package ch.systemsx.cisd.openbis.dss.client.api.gui;
 
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Timer;
+
+import javax.swing.JButton;
 import javax.swing.JDialog;
 import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.SwingUtilities;
 
 /**
  * @author Chandrasekhar Ramakrishnan
+ * @author Kaloyan Enimanev
  */
 public abstract class AbstractEntityPickerDialog extends JDialog
 {
 
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * do not spawn one thread for each subclass.
+     */
+    protected static final Timer scheduler = new Timer();
+
     protected final JFrame mainWindow;
 
+    protected final JButton refreshButton;
+
+    protected final DataSetUploadClientModel clientModel;
+
     /**
      * @param mainWindow The parent window of thie dialog
      * @param title The title of the window
+     * @param clientModel the client model used for connecting to the openBIS server and for
+     *            caching.
      */
-    public AbstractEntityPickerDialog(JFrame mainWindow, String title)
+    public AbstractEntityPickerDialog(JFrame mainWindow, String title,
+            DataSetUploadClientModel clientModel)
     {
         super(mainWindow, title, true);
         this.mainWindow = mainWindow;
+
+        this.clientModel = clientModel;
+
+        this.refreshButton = createRefreshButton();
     }
 
-    private static final long serialVersionUID = 1L;
+    /**
+     * populates the dialog based on content cached in {@link #clientModel}.
+     */
+    protected abstract void setDialogData();
+
+    protected JButton createRefreshButton()
+    {
+        final JButton button = new JButton();
+        button.setText("Refresh");
+        button.addActionListener(new ActionListener()
+            {
+                public void actionPerformed(ActionEvent e)
+                {
+                    button.setEnabled(false);
+                    refresh();
+                }
+            });
+        return button;
+    }
+
+    protected void refresh()
+    {
+        new Thread()
+            {
+                @Override
+                public void run()
+                {
+                    // reload data
+                    clientModel.reloadDataFromServer();
+
+                    // update UI
+                    SwingUtilities.invokeLater(new Runnable()
+                        {
+                            public void run()
+                            {
+                                setDialogData();
+                                refreshButton.setEnabled(true);
+                            }
+                        });
+                }
+            }.start();
+    }
+
+    protected static JPanel createFilterAndRefreshButtonPanel(JTextField textField,
+            JButton refreshButton)
+    {
+        JPanel innerPanel = new JPanel(new BorderLayout());
+        innerPanel.setMaximumSize(new Dimension(9999, 30));
+
+        refreshButton.setMargin(new Insets(refreshButton.getMargin().top, 2, refreshButton
+                .getMargin().bottom, 2));
+
+        innerPanel.add(textField, BorderLayout.CENTER);
+        innerPanel.add(refreshButton, BorderLayout.EAST);
+
+        GridBagConstraints gbc = new GridBagConstraints();
+        gbc.fill = GridBagConstraints.HORIZONTAL;
+        gbc.weightx = 1.0;
+
+        JPanel outerPanel = new JPanel(new GridBagLayout());
+        outerPanel.add(innerPanel, gbc);
+
+        return outerPanel;
+    }
 
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerDialogWithServerConnection.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerDialogWithServerConnection.java
deleted file mode 100644
index 06891d347bcfd978c0741b25afe07bd557a69584..0000000000000000000000000000000000000000
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerDialogWithServerConnection.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 2011 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.dss.client.api.gui;
-
-import java.util.Timer;
-
-import javax.swing.JFrame;
-
-import ch.systemsx.cisd.openbis.dss.client.api.v1.IOpenbisServiceFacade;
-
-/**
- * @author Chandrasekhar Ramakrishnan
- */
-public abstract class AbstractEntityPickerDialogWithServerConnection extends
-        AbstractEntityPickerDialog
-{
-
-    protected final IOpenbisServiceFacade openbisService;
-
-    protected final Timer scheduler = new Timer();
-
-    /**
-     * @param mainWindow
-     * @param title
-     */
-    public AbstractEntityPickerDialogWithServerConnection(JFrame mainWindow, String title,
-            final IOpenbisServiceFacade openbisService)
-    {
-        super(mainWindow, title);
-        this.openbisService = openbisService;
-    }
-
-    private static final long serialVersionUID = 1L;
-
-}
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerPanel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerPanel.java
index c09bee169b1fafb5e59b3ff09d5dbcaa37b3c7da..e838d295fbb7cb9540a8c652b7e1bdde037dc486 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerPanel.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/AbstractEntityPickerPanel.java
@@ -36,16 +36,12 @@ import java.awt.BorderLayout;
 import java.awt.Insets;
 import java.awt.event.ActionListener;
 import java.awt.event.FocusListener;
-import java.util.List;
 
 import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
 
-import ch.systemsx.cisd.openbis.dss.client.api.v1.IOpenbisServiceFacade;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment;
-
 /**
  * @author Pawel Glyzewski
  */
@@ -70,8 +66,7 @@ public abstract class AbstractEntityPickerPanel extends JPanel implements Action
 
     private final JButton button = new JButton("...");
 
-    public AbstractEntityPickerPanel(final JFrame mainWindow, List<Experiment> experiments,
-            IOpenbisServiceFacade openbisService)
+    public AbstractEntityPickerPanel(final JFrame mainWindow)
     {
         super(new BorderLayout());
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetMetadataPanel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetMetadataPanel.java
index d1cf5a3ebe85947fddfc431528e763807ee02f76..a265daa6eeec9d0829e6d969b74709fadfbde981 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetMetadataPanel.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetMetadataPanel.java
@@ -184,19 +184,9 @@ public class DataSetMetadataPanel extends JPanel implements Observer
 
         // Initialize the fields in the gui
         ownerIdLabel = new JLabel("Owner:", JLabel.TRAILING);
-        samplePanel =
-                new SamplePickerPanel(mainWindow, clientModel.getOpenBISService()
-                        .listExperimentsHavingSamplesForProjects(
-                                clientModel.getProjectIdentifiers()),
-                        clientModel.getOpenBISService());
-        dataSetPanel =
-                new DataSetPickerPanel(mainWindow, clientModel.getOpenBISService()
-                        .listExperimentsHavingDataSetsForProjects(
-                                clientModel.getProjectIdentifiers()),
-                        clientModel.getOpenBISService());
-        experimentPicker =
-                new ExperimentPickerPanel(mainWindow, clientModel.getExperiments(),
-                        clientModel.getOpenBISService());
+        samplePanel = new SamplePickerPanel(mainWindow, clientModel);
+        dataSetPanel = new DataSetPickerPanel(mainWindow, clientModel);
+        experimentPicker = new ExperimentPickerPanel(mainWindow, clientModel);
 
         ownerIdPanel = new JPanel(new CardLayout());
         ownerComboBox = new JComboBox(DataSetOwnerType.values());
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerDialog.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerDialog.java
index ce749335c42e3821c4e80329ae7c2bfec208c1d5..9183b4d1aee5b025c3d41e71493a9c2bb5ca7827 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerDialog.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerDialog.java
@@ -28,6 +28,7 @@ import java.util.TimerTask;
 import javax.swing.JDialog;
 import javax.swing.JFrame;
 import javax.swing.JOptionPane;
+import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTextField;
 import javax.swing.JTree;
@@ -44,14 +45,13 @@ import javax.swing.tree.TreeSelectionModel;
 
 import ch.systemsx.cisd.openbis.dss.client.api.gui.tree.FilterableMutableTreeNode;
 import ch.systemsx.cisd.openbis.dss.client.api.v1.DataSet;
-import ch.systemsx.cisd.openbis.dss.client.api.v1.IOpenbisServiceFacade;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample;
 
 /**
  * @author Pawel Glyzewski
  */
-public class DataSetPickerDialog extends AbstractEntityPickerDialogWithServerConnection implements
+public class DataSetPickerDialog extends AbstractEntityPickerDialog implements
         TreeWillExpandListener
 {
     private static final long serialVersionUID = 1L;
@@ -62,31 +62,41 @@ public class DataSetPickerDialog extends AbstractEntityPickerDialogWithServerCon
 
     private final JOptionPane optionPane;
 
-    /**
-     * @param mainWindow
-     * @param experiments
-     * @param openbisService
-     */
-    public DataSetPickerDialog(JFrame mainWindow, List<Experiment> experiments,
-            final IOpenbisServiceFacade openbisService)
+    public DataSetPickerDialog(JFrame mainWindow, DataSetUploadClientModel clientModel)
     {
-        super(mainWindow, "Pick a data set", openbisService);
+        super(mainWindow, "Pick a data set", clientModel);
 
-        FilterableMutableTreeNode top = new FilterableMutableTreeNode("Experiments");
-        createNodes(top, experiments);
-        tree = new JTree(top);
+        tree = new JTree();
         tree.addTreeWillExpandListener(this);
         tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
 
-        filterField = createFilterField(top, tree);
+        filterField = createFilterField();
 
-        optionPane = createOptionPane(filterField, tree, this);
+        JPanel northPanel = createFilterAndRefreshButtonPanel(filterField, refreshButton);
+        optionPane = createOptionPane(northPanel, tree, this);
 
         addTreeSelectionListener();
+        setDialogData();
 
         this.setContentPane(optionPane);
     }
 
+    @Override
+    protected void setDialogData()
+    {
+        FilterableMutableTreeNode top = new FilterableMutableTreeNode("Experiments");
+
+        final List<String> projectIdentifiers = clientModel.getProjectIdentifiers();
+        List<Experiment> experiments =
+                clientModel.getOpenBISService().listExperimentsHavingDataSetsForProjects(
+                        projectIdentifiers);
+        createNodes(top, experiments);
+
+        DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel();
+        treeModel.setRoot(top);
+        updateTreeSelection();
+    }
+
     /**
      * Treat double click and return the same as clicking the ok button.
      */
@@ -105,13 +115,13 @@ public class DataSetPickerDialog extends AbstractEntityPickerDialogWithServerCon
             });
     }
 
-    private static JOptionPane createOptionPane(JTextField filterField, final JTree tree,
+    private static JOptionPane createOptionPane(final JPanel northPanel, final JTree tree,
             final JDialog parent)
     {
         final JScrollPane scrollPane = new JScrollPane(tree);
 
         Object[] objects = new Object[]
-            { "Filter experiments: ", filterField, "Select data set:", scrollPane };
+            { "Filter experiments: ", northPanel, "Select data set:", scrollPane };
         final JOptionPane optionPane =
                 new JOptionPane(objects, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
         optionPane.addPropertyChangeListener(new PropertyChangeListener()
@@ -157,33 +167,37 @@ public class DataSetPickerDialog extends AbstractEntityPickerDialogWithServerCon
         }
     }
 
-    private static JTextField createFilterField(final FilterableMutableTreeNode treeNode,
-            final JTree tree)
+    private JTextField createFilterField()
     {
-        final JTextField filterField = new JTextField();
-        filterField.setEditable(true);
-        filterField.getDocument().addDocumentListener(new DocumentListener()
+        final JTextField textField = new JTextField();
+        textField.setEditable(true);
+        textField.getDocument().addDocumentListener(new DocumentListener()
             {
                 public void removeUpdate(DocumentEvent e)
                 {
-                    treeNode.filter(filterField.getText());
-                    ((DefaultTreeModel) tree.getModel()).reload();
+                    updateTreeSelection();
                 }
 
                 public void insertUpdate(DocumentEvent e)
                 {
-                    treeNode.filter(filterField.getText());
-                    ((DefaultTreeModel) tree.getModel()).reload();
+                    updateTreeSelection();
                 }
 
                 public void changedUpdate(DocumentEvent e)
                 {
-                    treeNode.filter(filterField.getText());
-                    ((DefaultTreeModel) tree.getModel()).reload();
+                    updateTreeSelection();
                 }
             });
 
-        return filterField;
+        return textField;
+    }
+
+    private void updateTreeSelection()
+    {
+        DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel();
+        FilterableMutableTreeNode rootNode = (FilterableMutableTreeNode) treeModel.getRoot();
+        rootNode.filter(filterField.getText());
+        treeModel.reload();
     }
 
     public String pickDataSet()
@@ -290,27 +304,29 @@ public class DataSetPickerDialog extends AbstractEntityPickerDialogWithServerCon
 
     protected List<DataSet> listExperimentDataSets(TreeExpansionEvent event)
     {
+        final List<String> experimentId =
+                Collections.singletonList(event.getPath().getLastPathComponent().toString());
         List<DataSet> dataSets =
-                openbisService.listDataSetsForExperiments(Collections.singletonList(event
-                        .getPath().getLastPathComponent().toString()));
+                clientModel.getOpenBISService().listDataSetsForExperiments(experimentId);
         UploadClientSortingUtils.sortDataSetsByCode(dataSets);
         return dataSets;
     }
 
     protected List<Sample> listExperimentSamples(TreeExpansionEvent event)
     {
+        final List<String> experimentId =
+                Collections.singletonList(event.getPath().getLastPathComponent().toString());
         List<Sample> samples =
-                openbisService.listSamplesForExperiments(Collections.singletonList(event
-                        .getPath().getLastPathComponent().toString()));
+                clientModel.getOpenBISService().listSamplesForExperiments(experimentId);
         UploadClientSortingUtils.sortSamplesByIdentifier(samples);
         return samples;
     }
 
     protected List<DataSet> listSampleDataSets(TreeExpansionEvent event)
     {
-        List<DataSet> dataSets =
-                openbisService.listDataSetsForSamples(Collections.singletonList(event.getPath()
-                        .getLastPathComponent().toString()));
+        final List<String> sampleId = Collections.singletonList(event.getPath()
+                .getLastPathComponent().toString());
+        List<DataSet> dataSets = clientModel.getOpenBISService().listDataSetsForSamples(sampleId);
         UploadClientSortingUtils.sortDataSetsByCode(dataSets);
         return dataSets;
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerPanel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerPanel.java
index b4d4217292e2b15ce0ccceb2bfae6ce8a5e5c399..89aa0db1460d6da44801ea6cef6b4b085c43d8a4 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerPanel.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPickerPanel.java
@@ -17,13 +17,9 @@
 package ch.systemsx.cisd.openbis.dss.client.api.gui;
 
 import java.awt.event.ActionEvent;
-import java.util.List;
 
 import javax.swing.JFrame;
 
-import ch.systemsx.cisd.openbis.dss.client.api.v1.IOpenbisServiceFacade;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment;
-
 /**
  * @author Pawel Glyzewski
  */
@@ -33,12 +29,11 @@ public class DataSetPickerPanel extends AbstractEntityPickerPanel
 
     private final DataSetPickerDialog dialog;
 
-    public DataSetPickerPanel(final JFrame mainWindow, List<Experiment> experiments,
-            IOpenbisServiceFacade openbisService)
+    public DataSetPickerPanel(final JFrame mainWindow, final DataSetUploadClientModel clientModel)
     {
-        super(mainWindow, experiments, openbisService);
+        super(mainWindow);
 
-        dialog = new DataSetPickerDialog(mainWindow, experiments, openbisService);
+        dialog = new DataSetPickerDialog(mainWindow, clientModel);
     }
 
     public void actionPerformed(ActionEvent e)
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClientModel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClientModel.java
index a8b8a39b5a57adec2edad99139f3f5195e8d9f2c..ca61c4d270d2b529dbfda8363cd0086e5fce7852 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClientModel.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClientModel.java
@@ -98,6 +98,11 @@ public class DataSetUploadClientModel
         this.openBISService = commState.getOpenBISService();
         this.timeProvider = timeProvider;
 
+        reloadDataFromServer();
+    }
+
+    public void reloadDataFromServer()
+    {
         DataSetTypeFilter filter =
                 new DataSetTypeFilter(
                         System.getProperty(ResourceNames.CREATABLE_DATA_SET_TYPES_WHITELIST),
@@ -574,12 +579,12 @@ public class DataSetUploadClientModel
 
     public List<Experiment> getExperiments()
     {
-        return experiments;
+        return Collections.unmodifiableList(experiments);
     }
 
     public List<String> getProjectIdentifiers()
     {
-        return projectIdentifiers;
+        return Collections.unmodifiableList(projectIdentifiers);
     }
 
     public Vocabulary getVocabulary(String code)
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerDialog.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerDialog.java
index 32552882ebd3a7e3b3891098755820d752a5df2e..5c23715048677965fc60a0869d58884206d23dc8 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerDialog.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerDialog.java
@@ -28,6 +28,7 @@ import java.util.List;
 import javax.swing.JDialog;
 import javax.swing.JFrame;
 import javax.swing.JOptionPane;
+import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTable;
 import javax.swing.JTextField;
@@ -55,29 +56,32 @@ public class ExperimentPickerDialog extends AbstractEntityPickerDialog
 
     private final JTable table;
 
-    final JTextField filterField;
+    private final JTextField filterField;
 
     private final JOptionPane optionPane;
 
-    public ExperimentPickerDialog(JFrame mainWindow, List<Experiment> experiments)
+    public ExperimentPickerDialog(JFrame mainWindow, DataSetUploadClientModel clientModel)
     {
-        super(mainWindow, "Pick an experiment");
+        super(mainWindow, "Pick an experiment", clientModel);
 
-        table = createTable(prepareData(experiments));
+        table = createTable();
         filterField = createFilterField(table);
-        optionPane = createOptionPane(filterField, table, this);
+
+        JPanel northPanel = createFilterAndRefreshButtonPanel(filterField, refreshButton);
+        optionPane = createOptionPane(northPanel, table, this);
         createTableListener(table, optionPane);
+        setDialogData();
 
         this.setContentPane(optionPane);
     }
 
-    private static JOptionPane createOptionPane(JTextField filterField, final JTable table,
+    private static JOptionPane createOptionPane(JPanel northPanel, final JTable table,
             final JDialog parent)
     {
         final JScrollPane scrollPane = new JScrollPane(table);
 
         Object[] objects = new Object[]
-            { "Filter experiments: ", filterField, "Select Experiment:", scrollPane };
+            { "Filter experiments: ", northPanel, "Select Experiment:", scrollPane };
         final JOptionPane optionPane =
                 new JOptionPane(objects, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
         optionPane.addPropertyChangeListener(new PropertyChangeListener()
@@ -120,10 +124,9 @@ public class ExperimentPickerDialog extends AbstractEntityPickerDialog
         return data;
     }
 
-    private static JTable createTable(List<String[]> data)
+    private static JTable createTable()
     {
-        final JTable table = new JTable(new SortableFilterableTableModel(data, HEADERS));
-
+        final JTable table = new JTable();
         table.setPreferredScrollableViewportSize(new Dimension(500, 150));
         table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
 
@@ -132,10 +135,6 @@ public class ExperimentPickerDialog extends AbstractEntityPickerDialog
         {
             table.getColumnModel().getColumn(i).setPreferredWidth(110);
         }
-        table.getColumnModel().getColumn(3).setPreferredWidth(200);
-
-        header.addMouseListener(new TableHeaderMouseListener((SortableFilterableTableModel) table
-                .getModel()));
         header.setDefaultRenderer(new SortButtonRenderer());
 
         return table;
@@ -190,6 +189,18 @@ public class ExperimentPickerDialog extends AbstractEntityPickerDialog
         return filterField;
     }
 
+    @Override
+    protected void setDialogData()
+    {
+        List<Experiment> experiments = clientModel.getExperiments();
+        final SortableFilterableTableModel model =
+                new SortableFilterableTableModel(prepareData(experiments), HEADERS);
+        table.setModel(model);
+        table.getTableHeader().addMouseListener(new TableHeaderMouseListener(model));
+        model.filter(filterField.getText());
+        table.getColumnModel().getColumn(3).setPreferredWidth(200);
+    }
+
     public String pickExperiment()
     {
         this.pack();
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerPanel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerPanel.java
index f9733c211ccc4faf01aa7a5fb03dbbf303e598d8..c60103ed2c7534c0391bd3cb8ac4227e14f2a885 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerPanel.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/ExperimentPickerPanel.java
@@ -17,13 +17,9 @@
 package ch.systemsx.cisd.openbis.dss.client.api.gui;
 
 import java.awt.event.ActionEvent;
-import java.util.List;
 
 import javax.swing.JFrame;
 
-import ch.systemsx.cisd.openbis.dss.client.api.v1.IOpenbisServiceFacade;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment;
-
 /**
  * @author Pawel Glyzewski
  */
@@ -33,12 +29,11 @@ public class ExperimentPickerPanel extends AbstractEntityPickerPanel
 
     private final ExperimentPickerDialog dialog;
 
-    public ExperimentPickerPanel(final JFrame mainWindow, final List<Experiment> experiments,
-            IOpenbisServiceFacade openbisServiceFacade)
+    public ExperimentPickerPanel(final JFrame mainWindow, DataSetUploadClientModel clientModel)
     {
-        super(mainWindow, experiments, openbisServiceFacade);
+        super(mainWindow);
 
-        dialog = new ExperimentPickerDialog(mainWindow, experiments);
+        dialog = new ExperimentPickerDialog(mainWindow, clientModel);
     }
 
     public void actionPerformed(ActionEvent e)
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerDialog.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerDialog.java
index fabba382f3324887726d82b28ec82a40842d1ef9..c6b2d4143d0186a2985b6970be160cb1b1c73584 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerDialog.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerDialog.java
@@ -27,6 +27,7 @@ import java.util.TimerTask;
 
 import javax.swing.JFrame;
 import javax.swing.JOptionPane;
+import javax.swing.JPanel;
 import javax.swing.JScrollPane;
 import javax.swing.JTextField;
 import javax.swing.JTree;
@@ -42,14 +43,13 @@ import javax.swing.tree.TreePath;
 import javax.swing.tree.TreeSelectionModel;
 
 import ch.systemsx.cisd.openbis.dss.client.api.gui.tree.FilterableMutableTreeNode;
-import ch.systemsx.cisd.openbis.dss.client.api.v1.IOpenbisServiceFacade;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample;
 
 /**
  * @author Pawel Glyzewski
  */
-public class SamplePickerDialog extends AbstractEntityPickerDialogWithServerConnection implements
+public class SamplePickerDialog extends AbstractEntityPickerDialog implements
         TreeWillExpandListener
 {
     private static final long serialVersionUID = 1L;
@@ -60,31 +60,43 @@ public class SamplePickerDialog extends AbstractEntityPickerDialogWithServerConn
 
     private final JOptionPane optionPane;
 
-    /**
-     * @param mainWindow
-     * @param experiments
-     * @param openbisService
-     */
-    public SamplePickerDialog(JFrame mainWindow, List<Experiment> experiments,
-            final IOpenbisServiceFacade openbisService)
+    public SamplePickerDialog(JFrame mainWindow, DataSetUploadClientModel clientModel)
     {
-        super(mainWindow, "Pick a sample", openbisService);
+        super(mainWindow, "Pick a sample", clientModel);
 
-        FilterableMutableTreeNode top = new FilterableMutableTreeNode("Experiments");
-        createNodes(top, experiments);
-        tree = new JTree(top);
+        tree = new JTree();
+        tree.setModel(new DefaultTreeModel(null));
         tree.addTreeWillExpandListener(this);
         tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
 
-        filterField = createFilterField(top, tree);
+        filterField = createFilterField();
 
-        optionPane = createOptionPane(tree, filterField, this);
+        JPanel northPanel = createFilterAndRefreshButtonPanel(filterField, refreshButton);
+        optionPane = createOptionPane(tree, northPanel, this);
 
         addTreeSelectionListener();
+        setDialogData();
 
         this.setContentPane(optionPane);
     }
 
+    @Override
+    protected void setDialogData()
+    {
+        FilterableMutableTreeNode top = new FilterableMutableTreeNode("Experiments");
+        
+        final List<String> projectIdentifiers = clientModel.getProjectIdentifiers();
+        List<Experiment> experiments =
+                clientModel.getOpenBISService().listExperimentsHavingSamplesForProjects(
+                        projectIdentifiers);
+        createNodes(top, experiments);
+        
+        DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel();
+        treeModel.setRoot(top);
+        updateTreeSelection();
+    }
+
+
     /**
      * Treat double click and return the same as clicking the ok button.
      */
@@ -103,13 +115,13 @@ public class SamplePickerDialog extends AbstractEntityPickerDialogWithServerConn
             });
     }
 
-    private static JOptionPane createOptionPane(final JTree tree, final JTextField filterField,
+    private static JOptionPane createOptionPane(final JTree tree, final JPanel northPanel,
             final SamplePickerDialog parent)
     {
         final JScrollPane scrollPane = new JScrollPane(tree);
 
         Object[] objects = new Object[]
-            { "Filter experiments: ", filterField, "Select Sample:", scrollPane };
+            { "Filter experiments: ", northPanel, "Select Sample:", scrollPane };
         final JOptionPane theOptionPane =
                 new JOptionPane(objects, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
 
@@ -180,33 +192,41 @@ public class SamplePickerDialog extends AbstractEntityPickerDialogWithServerConn
         }
     }
 
-    private static JTextField createFilterField(final FilterableMutableTreeNode treeNode,
-            final JTree tree)
+    private JTextField createFilterField()
     {
-        final JTextField filterField = new JTextField();
-        filterField.setEditable(true);
-        filterField.getDocument().addDocumentListener(new DocumentListener()
+        final JTextField textField = new JTextField();
+        textField.setEditable(true);
+        textField.getDocument().addDocumentListener(new DocumentListener()
             {
                 public void removeUpdate(DocumentEvent e)
                 {
-                    treeNode.filter(filterField.getText());
-                    ((DefaultTreeModel) tree.getModel()).reload();
+                    updateTreeSelection();
                 }
 
                 public void insertUpdate(DocumentEvent e)
                 {
-                    treeNode.filter(filterField.getText());
-                    ((DefaultTreeModel) tree.getModel()).reload();
+                    updateTreeSelection();
                 }
 
                 public void changedUpdate(DocumentEvent e)
                 {
-                    treeNode.filter(filterField.getText());
-                    ((DefaultTreeModel) tree.getModel()).reload();
+                    updateTreeSelection();
                 }
+
             });
 
-        return filterField;
+        return textField;
+    }
+
+    private void updateTreeSelection()
+    {
+        DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel();
+        FilterableMutableTreeNode rootNode = (FilterableMutableTreeNode) treeModel.getRoot();
+        if (rootNode != null)
+        {
+            rootNode.filter(filterField.getText());
+        }
+        treeModel.reload();
     }
 
     public String pickSample()
@@ -275,9 +295,10 @@ public class SamplePickerDialog extends AbstractEntityPickerDialogWithServerConn
 
     protected List<Sample> listSortedSamples(TreeExpansionEvent event)
     {
+        final List<String> experimentId =
+                Collections.singletonList(event.getPath().getLastPathComponent().toString());
         List<Sample> samples =
-                openbisService.listSamplesForExperiments(Collections.singletonList(event.getPath()
-                        .getLastPathComponent().toString()));
+                clientModel.getOpenBISService().listSamplesForExperiments(experimentId);
         UploadClientSortingUtils.sortSamplesByIdentifier(samples);
         return samples;
     }
@@ -290,4 +311,5 @@ public class SamplePickerDialog extends AbstractEntityPickerDialogWithServerConn
         node.removeAllChildren();
         node.add(new DefaultMutableTreeNode("dummy child"));
     }
+
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerPanel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerPanel.java
index 3a44f109a2a548da67e388d0f85bdfafa8e7e43b..5336ac80b868d64d8af3ef81a727d166c6a0445f 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerPanel.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/SamplePickerPanel.java
@@ -17,13 +17,9 @@
 package ch.systemsx.cisd.openbis.dss.client.api.gui;
 
 import java.awt.event.ActionEvent;
-import java.util.List;
 
 import javax.swing.JFrame;
 
-import ch.systemsx.cisd.openbis.dss.client.api.v1.IOpenbisServiceFacade;
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment;
-
 /**
  * @author Pawel Glyzewski
  */
@@ -33,12 +29,11 @@ public class SamplePickerPanel extends AbstractEntityPickerPanel
 
     private final SamplePickerDialog dialog;
 
-    public SamplePickerPanel(final JFrame mainWindow, List<Experiment> experiments,
-            IOpenbisServiceFacade openbisService)
+    public SamplePickerPanel(final JFrame mainWindow, DataSetUploadClientModel clientModel)
     {
-        super(mainWindow, experiments, openbisService);
+        super(mainWindow);
 
-        dialog = new SamplePickerDialog(mainWindow, experiments, openbisService);
+        dialog = new SamplePickerDialog(mainWindow, clientModel);
     }
 
     public void actionPerformed(ActionEvent e)