diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/DataSetRegistrationIngestionService.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/DataSetRegistrationIngestionService.java
index 83379ae11e430a30c5623544f3ffc5c13e81e613..a15e7bc74ca2eab9f98c61383eece1d456d46cb8 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/DataSetRegistrationIngestionService.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/DataSetRegistrationIngestionService.java
@@ -52,13 +52,13 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty;
+import ch.systemsx.cisd.openbis.generic.shared.util.IRowBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.util.SimpleTableModelBuilder;
 
 class DataSetRegistrationIngestionService extends IngestionService<DataSetInformation>
 {
     private static final long serialVersionUID = 1L;
-
-    private List<String> notSyncedDataSetCodes;
-
+ 
     private final NewExternalData dataSet;
 
     private final String loginUser;
@@ -71,20 +71,16 @@ class DataSetRegistrationIngestionService extends IngestionService<DataSetInform
 
     private final String harvesterTempDir;
 
-    private final Logger log;
-
-    public DataSetRegistrationIngestionService(Properties properties, File storeRoot, List<String> notSyncedDataSetCodes, NewExternalData ds,
+    public DataSetRegistrationIngestionService(Properties properties, File storeRoot, NewExternalData ds,
             Logger operationLog)
     {
         super(properties, storeRoot);
-        this.notSyncedDataSetCodes = notSyncedDataSetCodes;
         this.dataSet = ds;
         this.loginUser = properties.getProperty("user");
         this.loginPass = properties.getProperty("pass");
         this.asUrl = properties.getProperty("as-url");
         this.dssUrl = properties.getProperty("dss-url");
         this.harvesterTempDir = properties.getProperty("harvester-temp-dir");
-        this.log = operationLog;
     }
 
     @Override
@@ -134,6 +130,7 @@ class DataSetRegistrationIngestionService extends IngestionService<DataSetInform
             {
                 transaction.moveFile(f.getAbsolutePath(), ds);
             }
+            return summaryTableModel(parameters, "Added");
         }
         else
         {
@@ -153,8 +150,18 @@ class DataSetRegistrationIngestionService extends IngestionService<DataSetInform
             {
                 dataSetForUpdate.setPropertyValue(propCode, "");
             }
+            return summaryTableModel(parameters, "Updated");
         }
-        return null;
+    }
+
+    private TableModel summaryTableModel(Map<String, Object> parameters, String summary)
+    {
+        SimpleTableModelBuilder builder = new SimpleTableModelBuilder(true);
+        builder.addHeader("Parameters");
+        builder.addHeader(summary);
+        IRowBuilder row = builder.addRow();
+        row.setCell("Parameters", parameters.toString());
+        return builder.getTableModel();
     }
 
     private Set<String> extractPropertyNames(List<NewProperty> dataSetProperties)
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/DataSetRegistrationSummary.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/DataSetRegistrationSummary.java
new file mode 100644
index 0000000000000000000000000000000000000000..a39234a489be41acd7e8ed82ac79c5c3bf8d9fb8
--- /dev/null
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/DataSetRegistrationSummary.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2017 ETH Zuerich, SIS
+ *
+ * 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.ethz.sis.openbis.generic.server.dss.plugins.sync.harvester.synchronizer;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * 
+ *
+ * @author Ganime Betul Akin
+ */
+class DataSetRegistrationSummary
+{
+    final List<String> notRegisteredDataSetCodes = Collections.synchronizedList(new ArrayList<String>());
+
+    final AtomicInteger addedDsCount = new AtomicInteger(0);
+
+    final AtomicInteger updatedDsCount = new AtomicInteger(0);
+}
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java
index 017d65e8c62e105986734e479e733359b2f787c6..43c5645c01f3633b3b68eb77d717c00ca960c603 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java
@@ -221,15 +221,18 @@ public class EntitySynchronizer
         Map<String, DataSetWithConnections> physicalDSMap =
                 data.filterPhysicalDataSetsByLastModificationDate(lastSyncTimestamp, dataSetsCodesToRetry);
         operationLog.info("Registering data sets...");
-        List<String> notRegisteredDataSets = registerPhysicalDataSets(physicalDSMap);
-        operationLog.info((physicalDSMap.keySet().size() - notRegisteredDataSets.size()) + " data set(s) have been successfully registered. "
-                + notRegisteredDataSets.size()
+        DataSetRegistrationSummary dsRegistrationSummary = registerPhysicalDataSets(physicalDSMap);
+        operationLog.info("Data set registration summary:\n" + dsRegistrationSummary.addedDsCount + " data set(s) were added.\n"
+                + dsRegistrationSummary.updatedDsCount
+                + " data set(s) were updated.\n"
+                + dsRegistrationSummary.notRegisteredDataSetCodes.size()
                 + " data set(s) FAILED to register ");
 
         // link physical data sets registered above to container data sets
         // and set parent/child relationships
+        operationLog.info("\n");
         operationLog.info("start linking/un-linking container and component data sets");
-        establishDataSetRelationships(data.getDataSetsToProcess(), notRegisteredDataSets, physicalDSMap);
+        establishDataSetRelationships(data.getDataSetsToProcess(), dsRegistrationSummary.notRegisteredDataSetCodes, physicalDSMap);
 
         // cleanup();
 
@@ -389,19 +392,20 @@ public class EntitySynchronizer
         return false;
     }
 
-    private List<String> registerPhysicalDataSets(Map<String, DataSetWithConnections> physicalDSMap) throws IOException
+    private DataSetRegistrationSummary registerPhysicalDataSets(Map<String, DataSetWithConnections> physicalDSMap) throws IOException
     {
         List<DataSetWithConnections> dsList = new ArrayList<DataSetWithConnections>(physicalDSMap.values());
-        List<String> notRegisteredDataSetCodes = Collections.synchronizedList(new ArrayList<String>());
+        DataSetRegistrationSummary dsRegistrationSummary = new DataSetRegistrationSummary();
 
         // This parallelization is possible because each DS is registered without dependencies
         // and the dependencies are established later on in the sync process.
-        ParallelizedExecutor.process(dsList, new DataSetRegistrationTaskExecutor(notRegisteredDataSetCodes), 0.5, 10, "register data sets", 0, false);
+        ParallelizedExecutor.process(dsList, new DataSetRegistrationTaskExecutor(dsRegistrationSummary),
+                0.5, 10, "register data sets", 0, false);
 
         // backup the current not synced data set codes file, delete the original file
-        saveNotSyncedDataSetsFile(notRegisteredDataSetCodes);
+        saveNotSyncedDataSetsFile(dsRegistrationSummary.notRegisteredDataSetCodes);
 
-        return notRegisteredDataSetCodes;
+        return dsRegistrationSummary;
     }
 
     private void saveNotSyncedDataSetsFile(List<String> notRegisteredDataSetCodes) throws IOException
@@ -1002,12 +1006,11 @@ public class EntitySynchronizer
 
     private final class DataSetRegistrationTaskExecutor implements ITaskExecutor<DataSetWithConnections>
     {
+        private DataSetRegistrationSummary dsRegistrationSummary;
 
-        private List<String> notRegisteredDataSetCodes;
-
-        public DataSetRegistrationTaskExecutor(List<String> notRegisteredDataSetCodes)
+        public DataSetRegistrationTaskExecutor(DataSetRegistrationSummary dsRegSummary)
         {
-            this.notRegisteredDataSetCodes = notRegisteredDataSetCodes;
+            this.dsRegistrationSummary = dsRegSummary;
         }
 
         @Override
@@ -1018,7 +1021,7 @@ public class EntitySynchronizer
             Properties props = setProperties();
 
             DataSetRegistrationIngestionService ingestionService =
-                    new DataSetRegistrationIngestionService(props, storeRoot, notRegisteredDataSetCodes, dataSet.getDataSet(), operationLog);
+                    new DataSetRegistrationIngestionService(props, storeRoot, dataSet.getDataSet(), operationLog);
             TableModel resultTable = ingestionService.createAggregationReport(new HashMap<String, Object>(), context);
             if (resultTable != null)
             {
@@ -1029,10 +1032,18 @@ public class EntitySynchronizer
                     if (headers.get(i).getTitle().startsWith("Error"))
                     {
                         String message = resultTable.getRows().get(0).getValues().toString();
-                        notRegisteredDataSetCodes.add(dataSet.getDataSet().getCode());
+                        dsRegistrationSummary.notRegisteredDataSetCodes.add(dataSet.getDataSet().getCode());
                         operationLog.error(message);
                         return Status.createError(message);
                     }
+                    else if (headers.get(i).getTitle().startsWith("Added"))
+                    {
+                        dsRegistrationSummary.addedDsCount.getAndIncrement();
+                    }
+                    else if (headers.get(i).getTitle().startsWith("Updated"))
+                    {
+                        dsRegistrationSummary.updatedDsCount.getAndIncrement();
+                    }
                 }
             }
             return Status.OK;