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 1e9121111122e399aef49e4040360dc7020340c7..9c9c7a124bb39d6b6da88e3f4faf9686eab816f8 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
@@ -29,6 +29,8 @@ import java.awt.GridBagLayout;
 import java.awt.Insets;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 import java.io.File;
@@ -193,6 +195,19 @@ public class DataSetMetadataPanel extends JPanel
                 }
 
             });
+        ownerIdText.addFocusListener(new FocusListener()
+            {
+
+                public void focusLost(FocusEvent e)
+                {
+                    setOwnerId(ownerIdText.getText());
+                }
+
+                public void focusGained(FocusEvent e)
+                {
+                    // Do nothing
+                }
+            });
 
         experimentButton.addActionListener(new ActionListener()
             {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPropertiesPanel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPropertiesPanel.java
index 719d6455224a1fc5c7c325b634dc7da554f1c474..9604843ef6d3e4c232344a07ba4f26d143127b71 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPropertiesPanel.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetPropertiesPanel.java
@@ -26,6 +26,8 @@ import java.awt.GridBagLayout;
 import java.awt.Insets;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -111,6 +113,18 @@ public class DataSetPropertiesPanel extends JPanel
                 }
 
             });
+        textField.addFocusListener(new FocusListener()
+            {
+                public void focusLost(FocusEvent e)
+                {
+                    setPropertyValue(propertyType, textField.getText());
+                }
+
+                public void focusGained(FocusEvent e)
+                {
+                    // Do nothing
+                }
+            });
         addFormField(col, row, label, textField);
         formFields.put(propertyType.getCode(), textField);
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java
index 143a753a6d43e8b8d1704fdfb422fcef6ae3ca52..02a72f39110e7cac052838799fd022dc5f744467 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java
@@ -46,7 +46,6 @@ import javax.swing.table.TableCellRenderer;
 import javax.swing.table.TableColumn;
 
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
-import ch.systemsx.cisd.common.exceptions.NotImplementedException;
 import ch.systemsx.cisd.common.utilities.ITimeProvider;
 
 /**
@@ -82,7 +81,7 @@ public class DataSetUploadClient extends AbstractSwingGUI
             throws ch.systemsx.cisd.cifex.shared.basic.UserFailureException,
             EnvironmentFailureException
     {
-        setLookAndFeelToMetal();
+        setLookAndFeelToNative();
 
         try
         {
@@ -205,7 +204,7 @@ public class DataSetUploadClient extends AbstractSwingGUI
             {
                 public void actionPerformed(ActionEvent e)
                 {
-                    throw new NotImplementedException();
+                    clientModel.queueUploadOfDataSet(clientModel.getNewDataSetInfos());
                 }
             });
 
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 08d678ccc417a821ab8ea055422e02645101014b..55d3c9ecbb788ab8ba0c7830fb5596fd2933631a 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
@@ -20,10 +20,15 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
 
+import ch.systemsx.cisd.base.namedthread.NamingThreadPoolExecutor;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.io.TransmissionSpeedCalculator;
 import ch.systemsx.cisd.common.utilities.ITimeProvider;
+import ch.systemsx.cisd.openbis.dss.client.api.gui.DataSetUploadClientModel.NewDataSetInfo.Status;
 import ch.systemsx.cisd.openbis.dss.client.api.v1.IDssComponent;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.FileInfoDssDTO;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO;
@@ -38,6 +43,8 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.PropertyTypeGroup;
  */
 public class DataSetUploadClientModel
 {
+    private static ExecutorService executor = new NamingThreadPoolExecutor("Data Set Upload", 1, 1,
+            0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()).daemonize();
 
     private final IDssComponent dssComponent;
 
@@ -175,6 +182,12 @@ public class DataSetUploadClientModel
         {
             return status;
         }
+
+        public boolean canBeQueued()
+        {
+            return status != Status.UPLOADING && status != Status.STALLED
+                    && status != Status.COMPLETED_UPLOAD;
+        }
     }
 
     /**
@@ -191,11 +204,24 @@ public class DataSetUploadClientModel
     public NewDataSetInfo addNewDataSetInfo()
     {
         NewDataSetDTOBuilder newDataSetBuilder = new NewDataSetDTOBuilder();
+        String defaultDataSetTypeCode = getDefaultDataSetTypeCode();
+        newDataSetBuilder.getDataSetMetadata().setDataSetTypeOrNull(defaultDataSetTypeCode);
         NewDataSetInfo newDataSetInfo = new NewDataSetInfo(newDataSetBuilder, timeProvider);
         newDataSetInfos.add(newDataSetInfo);
         return newDataSetInfo;
     }
 
+    private String getDefaultDataSetTypeCode()
+    {
+        if (dataSetTypes.size() > 0)
+        {
+            return getDataSetTypes().get(0).getCode();
+        } else
+        {
+            return null;
+        }
+    }
+
     /**
      * Remove a data set info.
      */
@@ -285,6 +311,30 @@ public class DataSetUploadClientModel
         return newDataSetDTO;
     }
 
+    /**
+     * Start a data set upload in a separate thread. Callers need to ensure that queuing makes
+     * sense.
+     */
+    public void queueUploadOfDataSet(NewDataSetInfo newDataSetInfo)
+    {
+        if (false == newDataSetInfo.canBeQueued())
+        {
+            return;
+        }
+        newDataSetInfo.setStatus(Status.QUEUED_FOR_UPLOAD);
+        DataSetUploadOperation op = new DataSetUploadOperation(tableModel, this, newDataSetInfo);
+        executor.submit(op);
+    }
+
+    public void queueUploadOfDataSet(List<NewDataSetInfo> newDataSetInfosToQueue)
+    {
+        for (NewDataSetInfo newDataSetInfo : newDataSetInfosToQueue)
+        {
+            queueUploadOfDataSet(newDataSetInfo);
+        }
+
+    }
+
     private DataSetType tryDataSetType(String dataSetTypeCode)
     {
         if (null == dataSetTypeCode)
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadTableModel.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadTableModel.java
index ff6d18ccd7364a831ccc535204ea831e26c5ecbb..af1f13f85934da77f4ecd19689e46b325f243efe 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadTableModel.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadTableModel.java
@@ -22,9 +22,6 @@ import java.io.File;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
 
 import javax.swing.JFrame;
 import javax.swing.JTable;
@@ -33,9 +30,7 @@ import javax.swing.table.AbstractTableModel;
 import javax.swing.table.TableColumn;
 import javax.swing.table.TableColumnModel;
 
-import ch.systemsx.cisd.base.namedthread.NamingThreadPoolExecutor;
 import ch.systemsx.cisd.openbis.dss.client.api.gui.DataSetUploadClientModel.NewDataSetInfo;
-import ch.systemsx.cisd.openbis.dss.client.api.gui.DataSetUploadClientModel.NewDataSetInfo.Status;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO.DataSetOwner;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTOBuilder;
 
@@ -62,9 +57,6 @@ public class DataSetUploadTableModel extends AbstractTableModel
 
     static final int UPLOAD_STATUS_COLUMN = 4;
 
-    private static ExecutorService executor = new NamingThreadPoolExecutor("Data Set Upload", 1, 1,
-            0, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()).daemonize();
-
     private final JFrame mainWindow;
 
     private final DataSetUploadClientModel clientModel;
@@ -301,9 +293,7 @@ public class DataSetUploadTableModel extends AbstractTableModel
 
         // Only start uploading if the file hasn't been upload yet
         NewDataSetInfo.Status status = newDataSetInfo.getStatus();
-        if ((status != NewDataSetInfo.Status.TO_UPLOAD)
-                && (status != NewDataSetInfo.Status.COMPLETED_UPLOAD)
-                && (status != NewDataSetInfo.Status.FAILED))
+        if ((status != NewDataSetInfo.Status.TO_UPLOAD) && (status != NewDataSetInfo.Status.FAILED))
         {
             return;
         }
@@ -353,12 +343,30 @@ public class DataSetUploadTableModel extends AbstractTableModel
     {
         NewDataSetInfo newlyCreated = clientModel.addNewDataSetInfo();
         syncNewDataSetInfos();
+        ArrayList<Integer> selectedIndices = new ArrayList<Integer>();
+        selectedIndices.add(clientModel.getNewDataSetInfos().size() - 1);
+        setSelectedIndices(selectedIndices);
         selectNewDataSetInfo(newlyCreated);
     }
 
     public void removeSelectedDataSet()
     {
-        assert false : "Not yet implemented";
+        if (selectedRow < 0)
+        {
+            return;
+        }
+        if (selectedRow >= newDataSetInfos.size())
+        {
+            return;
+        }
+        NewDataSetInfo dataSetInfoToRemove = newDataSetInfos.get(selectedRow);
+
+        int newSelectedRow = Math.max(0, selectedRow - 1);
+        ArrayList<Integer> selectedIndices = new ArrayList<Integer>();
+        selectedIndices.add(newSelectedRow);
+        setSelectedIndices(selectedIndices);
+        clientModel.removeNewDataSetInfo(dataSetInfoToRemove);
+        syncNewDataSetInfos();
     }
 
     /**
@@ -390,9 +398,7 @@ public class DataSetUploadTableModel extends AbstractTableModel
      */
     private void queueUploadOfDataSet(NewDataSetInfo newDataSetInfo)
     {
-        newDataSetInfo.setStatus(Status.QUEUED_FOR_UPLOAD);
-        DataSetUploadOperation op = new DataSetUploadOperation(this, clientModel, newDataSetInfo);
-        executor.submit(op);
+        clientModel.queueUploadOfDataSet(newDataSetInfo);
     }
 
     public NewDataSetInfo getSelectedNewDataSet()
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/UploadStatusTableCellRenderer.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/UploadStatusTableCellRenderer.java
index 3d7725a8d688fe24d55f43d3dd603bde31cea89c..019cc94cdc1315551edbb93ae25477023ecb29c7 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/UploadStatusTableCellRenderer.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/UploadStatusTableCellRenderer.java
@@ -117,7 +117,7 @@ public class UploadStatusTableCellRenderer implements TableCellRenderer
             case STALLED:
                 panel = progressPanel;
                 progressBar.setValue(0);
-                progressLabel.setText("progress...");
+                progressLabel.setText("uploading...");
                 break;
             case COMPLETED_UPLOAD:
                 panel = completedPanel;
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/NewDataSetDTOBuilder.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/NewDataSetDTOBuilder.java
index d2d4c1ee22d91a74943e7871b9ca19b68ffa45cc..07b14e6524d7b1bc12e0bd8f4485ef23c0f03c83 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/NewDataSetDTOBuilder.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/NewDataSetDTOBuilder.java
@@ -110,6 +110,10 @@ public class NewDataSetDTOBuilder
         try
         {
             ArrayList<FileInfoDssDTO> fileInfos = new ArrayList<FileInfoDssDTO>();
+            if (null == file)
+            {
+                return fileInfos;
+            }
             if (false == file.exists())
             {
                 return fileInfos;