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 b43ee752c19af938df67ce278d77e7d0237c4602..1e9121111122e399aef49e4040360dc7020340c7 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
@@ -247,6 +247,7 @@ public class DataSetMetadataPanel extends JPanel
 
         newDataSetInfo.getNewDataSetBuilder().getDataSetMetadata()
                 .setDataSetTypeOrNull(dataSetType);
+        clientModel.notifyObserversOfChanges(newDataSetInfo);
     }
 
     protected void updateFileLabel()
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 77aae121d2198cd9e6d68bd94f0ee211a7170c01..719d6455224a1fc5c7c325b634dc7da554f1c474 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
@@ -143,7 +143,13 @@ public class DataSetPropertiesPanel extends JPanel
         NewDataSetMetadataDTO metadata = builder.getDataSetMetadata();
         Map<String, String> props = metadata.getProperties();
         HashMap<String, String> newProps = new HashMap<String, String>(props);
-        newProps.put(propertyType.getCode(), text);
+        if (null == text || text.trim().length() < 1)
+        {
+            newProps.remove(propertyType.getCode());
+        } else
+        {
+            newProps.put(propertyType.getCode(), text);
+        }
         metadata.setProperties(newProps);
 
         clientModel.notifyObserversOfChanges(newDataSetInfo);
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 f80f79623ca79930555778ed7f054510615ea79b..143a753a6d43e8b8d1704fdfb422fcef6ae3ca52 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,6 +46,7 @@ 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;
 
 /**
@@ -204,6 +205,7 @@ public class DataSetUploadClient extends AbstractSwingGUI
             {
                 public void actionPerformed(ActionEvent e)
                 {
+                    throw new NotImplementedException();
                 }
             });
 
@@ -268,6 +270,9 @@ public class DataSetUploadClient extends AbstractSwingGUI
                 fileTable.getColumnModel().getColumn(DataSetUploadTableModel.DATA_SET_OWNER_COLUMN);
         column.setPreferredWidth(320);
 
+        column = fileTable.getColumnModel().getColumn(DataSetUploadTableModel.DATA_SET_TYPE_COLUMN);
+        column.setPreferredWidth(150);
+
         column =
                 fileTable.getColumnModel().getColumn(
                         DataSetUploadTableModel.DATA_SET_METADATA_COLUMN);
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 d76c576508fa15f2ef9ae8ff68b81c31695900ed..08d678ccc417a821ab8ea055422e02645101014b 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
@@ -18,15 +18,20 @@ package ch.systemsx.cisd.openbis.dss.client.api.gui;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 
+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.v1.IDssComponent;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.FileInfoDssDTO;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTOBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.PropertyType;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.PropertyTypeGroup;
 
 /**
  * @author Chandrasekhar Ramakrishnan
@@ -212,16 +217,16 @@ public class DataSetUploadClientModel
         return dataSetTypes;
     }
 
-    public int getIndexOfDataSetType(String dataSetType)
+    public int getIndexOfDataSetType(String dataSetTypeCode)
     {
-        if (null == dataSetType)
+        if (null == dataSetTypeCode)
         {
             return 0;
         }
 
         for (int i = 0; i < dataSetTypes.size(); ++i)
         {
-            if (dataSetTypes.get(i).getCode().equals(dataSetType))
+            if (dataSetTypes.get(i).getCode().equals(dataSetTypeCode))
             {
                 return i;
             }
@@ -239,10 +244,63 @@ public class DataSetUploadClientModel
         this.tableModel = tableModel;
     }
 
-    // Broadcasting Notifications
+    /**
+     * Broadcast changes to observers.
+     */
     public void notifyObserversOfChanges(NewDataSetInfo changedInfo)
     {
         tableModel.selectedRowDataChanged();
     }
 
+    /**
+     * Clean the <var>newDataSetDTO</var> object. This means removing any properties that are not
+     * valid for the data set type.
+     */
+    public NewDataSetDTO cleanNewDataSetDTO(NewDataSetDTO newDataSetDTO)
+    {
+        DataSetType dataSetType = tryDataSetType(newDataSetDTO.tryDataSetType());
+        if (null == dataSetType)
+        {
+            throw new UserFailureException("The new data set has no type");
+        }
+
+        HashSet<String> allPropertyCodes = new HashSet<String>();
+        for (PropertyTypeGroup group : dataSetType.getPropertyTypeGroups())
+        {
+            for (PropertyType propertyType : group.getPropertyTypes())
+            {
+                allPropertyCodes.add(propertyType.getCode());
+            }
+        }
+
+        HashSet<String> keys = new HashSet<String>(newDataSetDTO.getProperties().keySet());
+        for (String propertyTypeCode : keys)
+        {
+            if (false == allPropertyCodes.contains(propertyTypeCode))
+            {
+                newDataSetDTO.getProperties().remove(propertyTypeCode);
+            }
+        }
+
+        return newDataSetDTO;
+    }
+
+    private DataSetType tryDataSetType(String dataSetTypeCode)
+    {
+        if (null == dataSetTypeCode)
+        {
+            return null;
+        }
+
+        for (int i = 0; i < dataSetTypes.size(); ++i)
+        {
+            DataSetType type = dataSetTypes.get(i);
+            if (type.getCode().equals(dataSetTypeCode))
+            {
+                return type;
+            }
+        }
+        return null;
+    }
+
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadOperation.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadOperation.java
index f9124f3428bd3a1147b72d68eb960aad4c1b2713..86efef9294aabb735c7d8606e636a7663bf71e72 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadOperation.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadOperation.java
@@ -21,6 +21,7 @@ import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.common.exceptions.FileExistsException;
 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;
 
 /**
  * DataSetUploadOperation represents a request to upload a data set to openBIS/dss. The upload
@@ -53,8 +54,10 @@ final class DataSetUploadOperation implements Runnable
             {
                 newDataSetInfo.setStatus(Status.UPLOADING);
                 tableModel.fireChanged(newDataSetInfo, Status.UPLOADING);
-                clientModel.getDssComponent().putDataSet(
-                        newDataSetInfo.getNewDataSetBuilder().asNewDataSetDTO(),
+                NewDataSetDTO cleanDto =
+                        clientModel.cleanNewDataSetDTO(newDataSetInfo.getNewDataSetBuilder()
+                                .asNewDataSetDTO());
+                clientModel.getDssComponent().putDataSet(cleanDto,
                         newDataSetInfo.getNewDataSetBuilder().getFile());
             }
             newDataSetInfo.setStatus(Status.COMPLETED_UPLOAD);
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 344cb26d8e49d7333bbb0a5ed41b0b66881c7408..ff6d18ccd7364a831ccc535204ea831e26c5ecbb 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
@@ -36,6 +36,8 @@ 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;
 
 /**
  * The DataSetUploadClientModel manages the list of data sets to register, initiates uploads (which
@@ -52,11 +54,13 @@ public class DataSetUploadTableModel extends AbstractTableModel
     // Constants for column order
     static final int DATA_SET_OWNER_COLUMN = 0;
 
-    static final int DATA_SET_METADATA_COLUMN = 1;
+    static final int DATA_SET_TYPE_COLUMN = 1;
 
-    static final int DATA_SET_PATH_COLUMN = 2;
+    static final int DATA_SET_METADATA_COLUMN = 2;
 
-    static final int UPLOAD_STATUS_COLUMN = 3;
+    static final int DATA_SET_PATH_COLUMN = 3;
+
+    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();
@@ -138,6 +142,15 @@ public class DataSetUploadTableModel extends AbstractTableModel
                     String identifier2 = info2.getNewDataSetBuilder().getDataSetOwnerIdentifier();
                     result = identifier1.compareTo(identifier2);
                     break;
+                case DATA_SET_TYPE_COLUMN:
+                    String type1 =
+                            info1.getNewDataSetBuilder().getDataSetMetadata().tryDataSetType();
+                    String type2 =
+                            info2.getNewDataSetBuilder().getDataSetMetadata().tryDataSetType();
+                    type1 = null == type1 ? "" : type1;
+                    type2 = null == type2 ? "" : type2;
+                    result = type1.compareTo(type2);
+                    break;
                 case DATA_SET_PATH_COLUMN:
                     File file1 = info1.getNewDataSetBuilder().getFile();
                     File file2 = info2.getNewDataSetBuilder().getFile();
@@ -194,7 +207,7 @@ public class DataSetUploadTableModel extends AbstractTableModel
 
     public int getColumnCount()
     {
-        return 4;
+        return 5;
     }
 
     public int getRowCount()
@@ -215,6 +228,9 @@ public class DataSetUploadTableModel extends AbstractTableModel
             case DATA_SET_OWNER_COLUMN:
                 name += " Owner";
                 break;
+            case DATA_SET_TYPE_COLUMN:
+                name += " Type";
+                break;
             case DATA_SET_METADATA_COLUMN:
                 name += " Metadata";
                 break;
@@ -231,20 +247,33 @@ public class DataSetUploadTableModel extends AbstractTableModel
     public Object getValueAt(int rowIndex, int columnIndex)
     {
         NewDataSetInfo newDataSetInfo = newDataSetInfos.get(rowIndex);
+        NewDataSetDTOBuilder builder = newDataSetInfo.getNewDataSetBuilder();
         switch (columnIndex)
         {
             case DATA_SET_OWNER_COLUMN:
-                return newDataSetInfo.getNewDataSetBuilder().getDataSetOwner();
+                DataSetOwner owner = builder.getDataSetOwner();
+                return owner.getType() + ":" + untouchedStringOrEmpty(owner.getIdentifier());
+            case DATA_SET_TYPE_COLUMN:
+                return untouchedStringOrEmpty(builder.getDataSetMetadata().tryDataSetType());
             case DATA_SET_METADATA_COLUMN:
-                return newDataSetInfo.getNewDataSetBuilder().getDataSetMetadata();
+                return builder.getDataSetMetadata().getProperties();
             case DATA_SET_PATH_COLUMN:
-                return newDataSetInfo.getNewDataSetBuilder().getFile();
+                File file = builder.getFile();
+                return (file == null) ? "" : file.getName();
             case UPLOAD_STATUS_COLUMN:
                 return newDataSetInfo;
         }
         return null;
     }
 
+    /**
+     * If aString is null, make it a string
+     */
+    private String untouchedStringOrEmpty(String aString)
+    {
+        return (aString == null) ? "" : aString;
+    }
+
     @Override
     public Class<?> getColumnClass(int c)
     {
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 065b65b82411ad8d32c172b029fba414d0274bb3..3d7725a8d688fe24d55f43d3dd603bde31cea89c 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
@@ -53,7 +53,7 @@ public class UploadStatusTableCellRenderer implements TableCellRenderer
 
     private final JPanel retryPanel = new JPanel();
 
-    private final JLabel completedLabel = new JLabel("Finished");
+    private final JLabel completedLabel = new JLabel("Registered");
 
     private final JPanel completedPanel = new JPanel();