diff --git a/microscopy-migration-tool/src/ethz/ch/Main.java b/microscopy-migration-tool/src/ethz/ch/Main.java
index ebfdf38bc65c0baad9e61730bc73afb39847c165..12ef35dffccc0da8eddb91138d6eb02e8e1fb94f 100644
--- a/microscopy-migration-tool/src/ethz/ch/Main.java
+++ b/microscopy-migration-tool/src/ethz/ch/Main.java
@@ -1,9 +1,6 @@
 package ethz.ch;
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchResult;
@@ -21,13 +18,16 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.fetchoptions.SpaceFetchOpt
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.search.SpaceSearchCriteria;
 import ch.ethz.sis.openbis.generic.dssapi.v3.IDataStoreServerApi;
 import ch.systemsx.cisd.common.spring.HttpInvokerUtils;
+import ethz.ch.dataset.DataSetPropertyCopy;
 import ethz.ch.dataset.DatasetCreationHelper;
 import ethz.ch.experiment.Experiment2Sample;
 import ethz.ch.experiment.Experiment2SampleTranslator;
 import ethz.ch.experiment.ExperimentType2SampleType;
 import ethz.ch.property.Property2Sample;
 import ethz.ch.property.Property2SampleTranslator;
+import ethz.ch.property.EntityPropertyCopy;
 import ethz.ch.property.PropertyType2SampleType;
+import ethz.ch.sample.SamplePropertyCopy;
 import ethz.ch.ssl.SslCertificateHelper;
 import ethz.ch.tag.Tag2SampleTranslator;
 
@@ -56,6 +56,9 @@ public class Main
             
             doTheWork(true, AS_URL, DSS_URL, user, pass, true, true, true);
         } else {
+            String AS_URL = OPENBIS_LOCAL_DEV + "/openbis/openbis" + IApplicationServerApi.SERVICE_URL;
+            String DSS_URL = DSS_LOCAL_DEV + "/datastore_server" + IDataStoreServerApi.SERVICE_URL;
+            doTheWork(true, AS_URL, DSS_URL, "pontia", "a", true, true, true);
             System.out.println("Example: java -jar microscopy_migration_tool.jar https://openbis-as-domain.ethz.ch https://openbis-dss-domain.ethz.ch user password");
         }
     }
@@ -90,23 +93,23 @@ public class Main
     }
     
     private static void migrate(String sessionToken, IApplicationServerApi v3, IDataStoreServerApi v3dss,boolean COMMIT_CHANGES_TO_OPENBIS) throws Exception {
-        
+
         //
         // Experiment types to migrate as samples
         //
-        
+
         ExperimentType2SampleType MICROSCOPY_EXPERIMENT = new ExperimentType2SampleType("MICROSCOPY_EXPERIMENT",    "MICROSCOPY_EXPERIMENTS_COLLECTION", "MICROSCOPY_EXPERIMENT_NAME");
         ExperimentType2SampleType FACS_ARIA_EXPERIMENT = new ExperimentType2SampleType("FACS_ARIA_EXPERIMENT",      "FLOW_SORTERS_EXPERIMENTS_COLLECTION", "FACS_ARIA_EXPERIMENT_NAME");
         ExperimentType2SampleType INFLUX_EXPERIMENT = new ExperimentType2SampleType("INFLUX_EXPERIMENT",            "FLOW_SORTERS_EXPERIMENTS_COLLECTION", "INFLUX_EXPERIMENT_NAME");
         ExperimentType2SampleType LSR_FORTESSA_EXPERIMENT = new ExperimentType2SampleType("LSR_FORTESSA_EXPERIMENT","FLOW_ANALYZERS_EXPERIMENTS_COLLECTION", "LSR_FORTESSA_EXPERIMENT_NAME");
         ExperimentType2SampleType MOFLO_XDP_EXPERIMENT = new ExperimentType2SampleType("MOFLO_XDP_EXPERIMENT",      "FLOW_SORTERS_EXPERIMENTS_COLLECTION", "MOFLO_XDP_EXPERIMENT_NAME");
         ExperimentType2SampleType S3E_EXPERIMENT = new ExperimentType2SampleType("S3E_EXPERIMENT",                  "FLOW_SORTERS_EXPERIMENTS_COLLECTION", "S3E_EXPERIMENT_NAME");
-        
+
         //
         // 1. Installing new sample types
         //
         System.out.println("1. Installing types");
-        
+
         // Install Sample Types for Experiment Types
         List<ExperimentType2SampleType> experimentMigrationConfigs = Arrays.asList(MICROSCOPY_EXPERIMENT,
                 FACS_ARIA_EXPERIMENT,
@@ -114,7 +117,7 @@ public class Main
                 LSR_FORTESSA_EXPERIMENT,
                 MOFLO_XDP_EXPERIMENT,
                 S3E_EXPERIMENT);
-        
+
         for(ExperimentType2SampleType experimentMigrationConfig:experimentMigrationConfigs) {
             if(COMMIT_CHANGES_TO_OPENBIS && !MasterdataHelper.doSampleTypeExist(sessionToken, v3, experimentMigrationConfig.getTypeCode())) {
                 MasterdataHelper.createSampleTypesFromExperimentTypes(sessionToken, v3, Arrays.asList(experimentMigrationConfig.getTypeCode()));
@@ -123,38 +126,38 @@ public class Main
                 System.out.println(experimentMigrationConfig.getTypeCode() + " Sample Type installation skipped.");
             }
         }
-        
+
         // Install Sample Type ORGANIZATION_UNIT
         if(COMMIT_CHANGES_TO_OPENBIS && !MasterdataHelper.doSampleTypeExist(sessionToken, v3, "ORGANIZATION_UNIT")) {
             v3.createSampleTypes(sessionToken, Collections.singletonList(MasterdataHelper.getSampleTypeORGANIZATION_UNIT()));
         }
         System.out.println("ORGANIZATION_UNIT Sample Type installed.");
-        
+
         if(COMMIT_CHANGES_TO_OPENBIS && !MasterdataHelper.doDataSetTypeExist(sessionToken, v3, "ATTACHMENT")) {
             v3.createDataSetTypes(sessionToken, Collections.singletonList(MasterdataHelper.getDataSetTypeATTACHMENT()));
         }
-        
+
         System.out.println("ATTACHMENT DataSet Type installed.");
-        
+
         //
         // 2. Creating new ORGANIZATION_UNITS_COLLECTION and MICROSCOPY_EXPERIMENTS_COLLECTION
         //
         System.out.println("2. Creating new ORGANIZATION_UNITS_COLLECTION and MICROSCOPY_EXPERIMENTS_COLLECTION");
-        
+
         // Create General ORGANIZATION_UNIT Collection for every PROJECT following the pattern /SPACE/PROJECT/ORGANIZATION_UNIT_COLLECTION
         // Create General ORGANIZATION_UNIT Collection for every SPACE following the pattern /SPACE/COMMON_ORGANIZATION_UNITS/ORGANIZATION_UNIT_COLLECTION
         SpaceFetchOptions spaceFetchOptions = new SpaceFetchOptions();
         spaceFetchOptions.withProjects();
-        
+
         SearchResult<Space> spaces = v3.searchSpaces(sessionToken, new SpaceSearchCriteria(), spaceFetchOptions);
-        
+
         for(Space space:spaces.getObjects()) {
             String spaceCode = space.getCode();
             if(!EXCLUDE_SPACES.contains(spaceCode)) {
                 // Install Project level collection
                 ProjectSearchCriteria projectSearchCriteria = new ProjectSearchCriteria();
                 projectSearchCriteria.withSpace().withCode().equals(spaceCode);
-                
+
                 for(Project project:space.getProjects()) {
                     String experimentIdentifierOU = "/" + spaceCode + "/" + project.getCode() + "/ORGANIZATION_UNITS_COLLECTION";
                     if(COMMIT_CHANGES_TO_OPENBIS && !MetadataHelper.doExperimentExist(v3, sessionToken, experimentIdentifierOU)) {
@@ -162,14 +165,14 @@ public class Main
                     }
                     System.out.println("Project Experiment Created: " + experimentIdentifierOU);
                 }
-                
+
                 // Install Space level project and collection
                 String projectIdentifier = "/" + spaceCode + "/COMMON_ORGANIZATION_UNITS";
                 if(COMMIT_CHANGES_TO_OPENBIS && !MetadataHelper.doProjectExist(v3, sessionToken, projectIdentifier)) {
                     v3.createProjects(sessionToken, Collections.singletonList(MetadataHelper.getProjectCreation(spaceCode, "COMMON_ORGANIZATION_UNITS", "Folder to share common organization units collections.")));
                 }
                 System.out.println("Space Project Created: " + projectIdentifier);
-                
+
                 String experimentIdentifier = "/" + spaceCode + "/COMMON_ORGANIZATION_UNITS/ORGANIZATION_UNITS_COLLECTION";
                 if(COMMIT_CHANGES_TO_OPENBIS && !MetadataHelper.doExperimentExist(v3, sessionToken, experimentIdentifier)) {
                     v3.createExperiments(sessionToken, Collections.singletonList(MetadataHelper.getOrganizationUnitCollectionCreation(new ProjectIdentifier("/" + spaceCode + "/COMMON_ORGANIZATION_UNITS"), "ORGANIZATION_UNITS_COLLECTION")));
@@ -177,9 +180,9 @@ public class Main
                 System.out.println("Space Experiment Created: " + experimentIdentifier);
             }
         }
-        
+
         System.out.println("3. Translate Experiment to Samples");
-        
+
         for(ExperimentType2SampleType config:experimentMigrationConfigs) {
             int total = 0;
             ExperimentSearchCriteria experimentSearchCriteria = new ExperimentSearchCriteria();
@@ -192,7 +195,7 @@ public class Main
                 System.out.println("[DONE] " + config.getTypeCode() + "\t" + total + "/" + experiments.getTotalCount());
             }
         }
-        
+
         System.out.println("4. Translate Properties to Samples");
 
         PropertyType2SampleType FACS_ARIA_TUBE =    new PropertyType2SampleType(        "FACS_ARIA_TUBE",   "FACS_ARIA_SPECIMEN",   "FACS_ARIA_SPECIMEN",   "$NAME");
@@ -201,16 +204,16 @@ public class Main
         PropertyType2SampleType LSR_FORTESSA_TUBE = new PropertyType2SampleType(        "LSR_FORTESSA_TUBE","LSR_FORTESSA_SPECIMEN","LSR_FORTESSA_SPECIMEN","$NAME");
         PropertyType2SampleType LSR_FORTESSA_WELL = new PropertyType2SampleType(        "LSR_FORTESSA_WELL","LSR_FORTESSA_SPECIMEN","LSR_FORTESSA_SPECIMEN","$NAME");
         PropertyType2SampleType MOFLO_XDP_TUBE =    new PropertyType2SampleType(        "MOFLO_XDP_TUBE",   "MOFLO_XDP_SPECIMEN",   "MOFLO_XDP_SPECIMEN",   "$NAME");
-        PropertyType2SampleType SE3_TUBE =          new PropertyType2SampleType(        "SE3_TUBE",         "SE3_SPECIMEN",         "SE3_SPECIMEN",         "$NAME");
-        
+        PropertyType2SampleType S3E_TUBE =          new PropertyType2SampleType(        "S3E_TUBE",         "S3E_SPECIMEN",         "S3E_SPECIMEN",         "$NAME");
+
         List<PropertyType2SampleType> propertiesMigrationConfigs = Arrays.asList(FACS_ARIA_TUBE,
                 FACS_ARIA_WELL,
                 INFLUX_TUBE,
                 LSR_FORTESSA_TUBE,
                 LSR_FORTESSA_WELL,
                 MOFLO_XDP_TUBE,
-                SE3_TUBE);
-        
+                S3E_TUBE);
+
         for(PropertyType2SampleType propertyMigrationConfigs:propertiesMigrationConfigs) {
             if(COMMIT_CHANGES_TO_OPENBIS && !MasterdataHelper.doSampleTypeExist(sessionToken, v3, propertyMigrationConfigs.getNewSampleTypeCode())) {
                 MasterdataHelper.createDefaultSampleType(sessionToken, v3, propertyMigrationConfigs.getNewSampleTypeCode());
@@ -219,7 +222,7 @@ public class Main
                 System.out.println(propertyMigrationConfigs.getNewSampleTypeCode() + " Sample Type installation skipped.");
             }
         }
-        
+
         for(PropertyType2SampleType config:propertiesMigrationConfigs) {
             int total = 0;
             SampleSearchCriteria sampleSearchCriteria = new SampleSearchCriteria();
@@ -232,5 +235,30 @@ public class Main
                 System.out.println("[DONE] " + config.getOldSampleTypeCode() + "\t" + total + "/" + samples.getTotalCount());
             }
         }
+
+        System.out.println("5. Copy Property A to Property B on Samples and DataSets");
+        EntityPropertyCopy LSR_FORTESSA_PLATE_p =           new SamplePropertyCopy( "LSR_FORTESSA_PLATE",       "LSR_FORTESSA_PLATE_NAME",             "$NAME");
+        EntityPropertyCopy LSR_FORTESSA_TUBE_p =            new SamplePropertyCopy( "LSR_FORTESSA_TUBE",        "LSR_FORTESSA_TUBE_NAME",              "$NAME");
+        EntityPropertyCopy LSR_FORTESSA_WELL_p =            new SamplePropertyCopy( "LSR_FORTESSA_WELL",        "LSR_FORTESSA_WELL_NAME",              "$NAME");
+        EntityPropertyCopy FACS_ARIA_TUBE_p =               new SamplePropertyCopy( "FACS_ARIA_TUBE",           "FACS_ARIA_TUBE_NAME",                 "$NAME");
+        EntityPropertyCopy INFLUX_TUBE_p =                  new SamplePropertyCopy( "INFLUX_TUBE",              "INFLUX_TUBE_NAME",                    "$NAME");
+        EntityPropertyCopy MOFLO_XDP_TUBE_p =               new SamplePropertyCopy( "MOFLO_XDP_TUBE",           "MOFLO_XDP_TUBE_NAME",                 "$NAME");
+        EntityPropertyCopy S3E_TUBE_p =                     new SamplePropertyCopy( "S3E_TUBE",                 "S3E_NAME",                            "$NAME");
+        EntityPropertyCopy MICROSCOPY_SAMPLE_TYPE_p =       new SamplePropertyCopy( "MICROSCOPY_SAMPLE_TYPE",   "MICROSCOPY_SAMPLE_NAME",              "$NAME");
+        EntityPropertyCopy MICROSCOPY_ACCESSORY_FILE_p =    new DataSetPropertyCopy("MICROSCOPY_ACCESSORY_FILE","MICROSCOPY_ACCESSORY_FILE_NAME",      "$NAME");
+
+        List<EntityPropertyCopy> propertyCopiesMigrationConfig = Arrays.asList(LSR_FORTESSA_PLATE_p,
+                LSR_FORTESSA_TUBE_p,
+                LSR_FORTESSA_WELL_p,
+                FACS_ARIA_TUBE_p,
+                INFLUX_TUBE_p,
+                MOFLO_XDP_TUBE_p,
+                S3E_TUBE_p,
+                MICROSCOPY_SAMPLE_TYPE_p,
+                MICROSCOPY_ACCESSORY_FILE_p);
+
+        for (EntityPropertyCopy config:propertyCopiesMigrationConfig) {
+            config.copy(sessionToken, v3);
+        }
     }
 }
diff --git a/microscopy-migration-tool/src/ethz/ch/MasterdataHelper.java b/microscopy-migration-tool/src/ethz/ch/MasterdataHelper.java
index 3f8e1f580d9187e0cb617f3d7b418874c0e4021d..03bc5663b0d4a345b64626401246beec491fd9e4 100644
--- a/microscopy-migration-tool/src/ethz/ch/MasterdataHelper.java
+++ b/microscopy-migration-tool/src/ethz/ch/MasterdataHelper.java
@@ -1,15 +1,15 @@
 package ethz.ch;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
+import java.util.*;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.update.ListUpdateValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSetType;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.create.DataSetTypeCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.fetchoptions.DataSetTypeFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.update.DataSetTypeUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.IEntityTypeId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.ExperimentType;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.create.ExperimentTypeCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.fetchoptions.ExperimentTypeFetchOptions;
@@ -25,6 +25,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.search.PropertyTypeSear
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.SampleType;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.create.SampleTypeCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleTypeFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.update.SampleTypeUpdate;
 
 public class MasterdataHelper
 {
@@ -158,7 +159,55 @@ public class MasterdataHelper
         
         createExperimentTypeIfMissing(sessionToken, v3, creation);
     }
-    
+
+    //
+    // Get
+    //
+
+    public static SampleType getSampleType(String sessionToken, IApplicationServerApi v3, String typeCode) {
+        EntityTypePermId id = new EntityTypePermId(typeCode);
+        SampleTypeFetchOptions fetchOptions = new SampleTypeFetchOptions();
+        fetchOptions.withPropertyAssignments().withPropertyType();
+        Map<IEntityTypeId, SampleType> types = v3.getSampleTypes(sessionToken, Arrays.asList(id), fetchOptions);
+        return types.get(id);
+    }
+
+    public static DataSetType getDataSetType(String sessionToken, IApplicationServerApi v3, String typeCode) {
+        EntityTypePermId id = new EntityTypePermId(typeCode);
+        DataSetTypeFetchOptions fetchOptions = new DataSetTypeFetchOptions();
+        fetchOptions.withPropertyAssignments().withPropertyType();
+        Map<IEntityTypeId, DataSetType> types = v3.getDataSetTypes(sessionToken, Arrays.asList(id), fetchOptions);
+        return types.get(id);
+    }
+
+    //
+    // Update
+    //
+
+    public static void updateSampleType(String sessionToken, IApplicationServerApi v3, String typeCode, int addOrder, String addPropertyTypeCode) {
+        SampleTypeUpdate update = new SampleTypeUpdate();
+        update.setTypeId(new EntityTypePermId(typeCode));
+        ListUpdateValue.ListUpdateActionAdd add = new ListUpdateValue.ListUpdateActionAdd();
+        PropertyAssignmentCreation propertyAssignmentCreation = new PropertyAssignmentCreation();
+        propertyAssignmentCreation.setOrdinal(addOrder);
+        propertyAssignmentCreation.setPropertyTypeId(new PropertyTypePermId(addPropertyTypeCode));
+        add.setItems(Arrays.asList(propertyAssignmentCreation));
+        update.setPropertyAssignmentActions(Arrays.asList(add));
+        v3.updateSampleTypes(sessionToken, Arrays.asList(update));
+    }
+
+    public static void updateDataSetType(String sessionToken, IApplicationServerApi v3, String typeCode, int addOrder, String addPropertyTypeCode) {
+        DataSetTypeUpdate update = new DataSetTypeUpdate();
+        update.setTypeId(new EntityTypePermId(typeCode));
+        ListUpdateValue.ListUpdateActionAdd add = new ListUpdateValue.ListUpdateActionAdd();
+        PropertyAssignmentCreation propertyAssignmentCreation = new PropertyAssignmentCreation();
+        propertyAssignmentCreation.setOrdinal(addOrder);
+        propertyAssignmentCreation.setPropertyTypeId(new PropertyTypePermId(addPropertyTypeCode));
+        add.setItems(Arrays.asList(propertyAssignmentCreation));
+        update.setPropertyAssignmentActions(Arrays.asList(add));
+        v3.updateDataSetTypes(sessionToken, Arrays.asList(update));
+    }
+
     //
     // Type to translate Attachments to DataSets
     //
diff --git a/microscopy-migration-tool/src/ethz/ch/MetadataHelper.java b/microscopy-migration-tool/src/ethz/ch/MetadataHelper.java
index cb01dfd1f6aaf6a10c6cd50e97549f1115628d72..aacbf6f9754b0250ec1113d57b2ba51c938e5144 100644
--- a/microscopy-migration-tool/src/ethz/ch/MetadataHelper.java
+++ b/microscopy-migration-tool/src/ethz/ch/MetadataHelper.java
@@ -9,6 +9,10 @@ import java.util.List;
 import java.util.Map;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSet;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.fetchoptions.DataSetFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.DataSetPermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.search.DataSetSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.update.DataSetUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.Experiment;
@@ -27,6 +31,8 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.create.SampleCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.ISampleId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.SampleSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.update.SampleUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
 
@@ -133,7 +139,23 @@ public class MetadataHelper
     //
     // Gets
     //
-    
+
+    public static List<Sample> getSamples(String sessionToken, IApplicationServerApi v3, String typeCode) {
+        SampleSearchCriteria sampleSearchCriteria = new SampleSearchCriteria();
+        sampleSearchCriteria.withType().withCode().thatEquals(typeCode);
+        SampleFetchOptions fetchOptions = new SampleFetchOptions();
+        fetchOptions.withProperties();
+        return v3.searchSamples(sessionToken, sampleSearchCriteria, fetchOptions).getObjects();
+    }
+
+    public static List<DataSet> getDataSets(String sessionToken, IApplicationServerApi v3, String typeCode) {
+        DataSetSearchCriteria searchCriteria = new DataSetSearchCriteria();
+        searchCriteria.withType().withCode().thatEquals(typeCode);
+        DataSetFetchOptions fetchOptions = new DataSetFetchOptions();
+        fetchOptions.withProperties();
+        return v3.searchDataSets(sessionToken, searchCriteria, fetchOptions).getObjects();
+    }
+
     public static Sample getSample(String sessionToken, IApplicationServerApi v3, ISampleId sampleId) {
         SampleFetchOptions fo = new SampleFetchOptions();
         fo.withProperties();
@@ -166,5 +188,22 @@ public class MetadataHelper
             throw new RuntimeException("Experiment with PermId not found: " + permId.getPermId());
         }
     }
-    
+
+    //
+    // Update
+    //
+
+    public static void updateSampleProperty(String sessionToken, IApplicationServerApi v3, String permId, String propertyCode, String propertyValue) {
+        SampleUpdate update = new SampleUpdate();
+        update.setSampleId(new SamplePermId(permId));
+        update.setProperty(propertyCode, propertyValue);
+        v3.updateSamples(sessionToken, Arrays.asList(update));
+    }
+
+    public static void updateDataSetProperty(String sessionToken, IApplicationServerApi v3, String permId, String propertyCode, String propertyValue) {
+        DataSetUpdate update = new DataSetUpdate();
+        update.setDataSetId(new DataSetPermId(permId));
+        update.setProperty(propertyCode, propertyValue);
+        v3.updateDataSets(sessionToken, Arrays.asList(update));
+    }
 }
diff --git a/microscopy-migration-tool/src/ethz/ch/dataset/DataSetPropertyCopy.java b/microscopy-migration-tool/src/ethz/ch/dataset/DataSetPropertyCopy.java
new file mode 100644
index 0000000000000000000000000000000000000000..03b180618f530228f5c54c5901e57b6fa81d0eb3
--- /dev/null
+++ b/microscopy-migration-tool/src/ethz/ch/dataset/DataSetPropertyCopy.java
@@ -0,0 +1,37 @@
+package ethz.ch.dataset;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertyAssignmentsHolder;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSet;
+import ethz.ch.MasterdataHelper;
+import ethz.ch.MetadataHelper;
+import ethz.ch.property.EntityPropertyCopy;
+
+import java.util.List;
+
+public class DataSetPropertyCopy extends EntityPropertyCopy<DataSet> {
+
+    public DataSetPropertyCopy(String typeCode, String oldPropertyCode, String newPropertyCode) {
+        super(typeCode, oldPropertyCode, newPropertyCode);
+    }
+
+    @Override
+    public IPropertyAssignmentsHolder getPropertyAssignmentsHolder(String sessionToken, IApplicationServerApi v3) {
+        return MasterdataHelper.getDataSetType(sessionToken, v3, typeCode);
+    }
+
+    @Override
+    public void updatePropertyAssignmentsHolder(String sessionToken, IApplicationServerApi v3) {
+        MasterdataHelper.updateDataSetType(sessionToken, v3, typeCode, 1, newPropertyCode);
+    }
+
+    @Override
+    public List<DataSet> getEntities(String sessionToken, IApplicationServerApi v3) {
+        return MetadataHelper.getDataSets(sessionToken, v3, typeCode);
+    }
+
+    @Override
+    public void updateEntityProperty(String sessionToken, IApplicationServerApi v3, DataSet entity) {
+        MetadataHelper.updateDataSetProperty(sessionToken, v3, entity.getPermId().getPermId(), newPropertyCode, entity.getProperty(oldPropertyCode));
+    }
+}
diff --git a/microscopy-migration-tool/src/ethz/ch/property/EntityPropertyCopy.java b/microscopy-migration-tool/src/ethz/ch/property/EntityPropertyCopy.java
new file mode 100644
index 0000000000000000000000000000000000000000..b4232ed199837fab316cc33c60d6435bf92b75b4
--- /dev/null
+++ b/microscopy-migration-tool/src/ethz/ch/property/EntityPropertyCopy.java
@@ -0,0 +1,64 @@
+package ethz.ch.property;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPermIdHolder;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertiesHolder;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertyAssignmentsHolder;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.PropertyAssignment;
+import java.util.List;
+
+public abstract class EntityPropertyCopy<ENTITY extends IPermIdHolder & IPropertiesHolder> {
+    protected String typeCode;
+    protected String oldPropertyCode;
+    protected String newPropertyCode;
+
+    public EntityPropertyCopy(String typeCode, String oldPropertyCode, String newPropertyCode) {
+        this.typeCode = typeCode;
+        this.oldPropertyCode = oldPropertyCode;
+        this.newPropertyCode = newPropertyCode;
+    }
+
+    public abstract IPropertyAssignmentsHolder getPropertyAssignmentsHolder(String sessionToken, IApplicationServerApi v3);
+
+    public abstract void updatePropertyAssignmentsHolder(String sessionToken, IApplicationServerApi v3);
+
+    public abstract List<ENTITY> getEntities(String sessionToken, IApplicationServerApi v3);
+
+    public abstract void updateEntityProperty(String sessionToken, IApplicationServerApi v3, ENTITY entity);
+
+    public void copy(String sessionToken, IApplicationServerApi v3) {
+        // Is Property B assigned to the type? If not Do
+        System.out.println("5. Copy Property " + oldPropertyCode + " to Property " + newPropertyCode + " on " + typeCode);
+        IPropertyAssignmentsHolder propertyAssignmentsHolder = getPropertyAssignmentsHolder(sessionToken, v3);
+        boolean found = false;
+        for (PropertyAssignment propertyAssignment:propertyAssignmentsHolder.getPropertyAssignments()) {
+            found = propertyAssignment.getPropertyType().getCode().equals(newPropertyCode);
+            if (found) {
+                break;
+            }
+        }
+        if (!found) {
+            System.out.println("Property Type " + newPropertyCode + " not found on " + typeCode);
+            updatePropertyAssignmentsHolder(sessionToken, v3);
+            System.out.println("Property Type " + newPropertyCode + " created on " + typeCode);
+        }
+
+        // Copy
+        int total = 0;
+        List<ENTITY> entities = getEntities(sessionToken, v3);
+
+        for(ENTITY entity:entities) {
+            if (entity.getProperty(oldPropertyCode) != null) {
+                if(!entity.getProperty(oldPropertyCode).equals(entity.getProperty(newPropertyCode))) {
+                    updateEntityProperty(sessionToken, v3, entity);
+                    System.out.println("[PREPARING] " + entity.getPermId() + "\t" + entity.getProperty(oldPropertyCode) + "\t" + total + "/" + entities.size());
+                } else {
+                    System.out.println("[SKIP] " + entity.getPermId() + "\t" + entity.getProperty(oldPropertyCode) + "\t" + total + "/" + entities.size());
+                }
+            }
+            total++;
+        }
+        System.out.println("[DONE] " + total + "/" + entities.size());
+
+    }
+}
diff --git a/microscopy-migration-tool/src/ethz/ch/sample/SamplePropertyCopy.java b/microscopy-migration-tool/src/ethz/ch/sample/SamplePropertyCopy.java
new file mode 100644
index 0000000000000000000000000000000000000000..76dbc7b2f7c3648f92ab8740232224af78ca498e
--- /dev/null
+++ b/microscopy-migration-tool/src/ethz/ch/sample/SamplePropertyCopy.java
@@ -0,0 +1,37 @@
+package ethz.ch.sample;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.interfaces.IPropertyAssignmentsHolder;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample;
+import ethz.ch.MasterdataHelper;
+import ethz.ch.MetadataHelper;
+import ethz.ch.property.EntityPropertyCopy;
+
+import java.util.List;
+
+public class SamplePropertyCopy extends EntityPropertyCopy<Sample> {
+
+    public SamplePropertyCopy(String typeCode, String oldPropertyCode, String newPropertyCode) {
+        super(typeCode, oldPropertyCode, newPropertyCode);
+    }
+
+    @Override
+    public IPropertyAssignmentsHolder getPropertyAssignmentsHolder(String sessionToken, IApplicationServerApi v3) {
+        return MasterdataHelper.getSampleType(sessionToken, v3, typeCode);
+    }
+
+    @Override
+    public void updatePropertyAssignmentsHolder(String sessionToken, IApplicationServerApi v3) {
+        MasterdataHelper.updateSampleType(sessionToken, v3, typeCode, 1, newPropertyCode);
+    }
+
+    @Override
+    public List<Sample> getEntities(String sessionToken, IApplicationServerApi v3) {
+        return MetadataHelper.getSamples(sessionToken, v3, typeCode);
+    }
+
+    @Override
+    public void updateEntityProperty(String sessionToken, IApplicationServerApi v3, Sample entity) {
+        MetadataHelper.updateSampleProperty(sessionToken, v3, entity.getPermId().getPermId(), newPropertyCode, entity.getProperty(oldPropertyCode));
+    }
+}
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/img/error.png b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/img/error.png
deleted file mode 100644
index 5c832c00dc0500c8e7a14961aa0088bcceabc6a1..0000000000000000000000000000000000000000
Binary files a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/img/error.png and /dev/null differ
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/img/wait.png b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/img/wait.png
deleted file mode 100644
index 0fe45f49527805aa459580082564916ce59934d4..0000000000000000000000000000000000000000
Binary files a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/img/wait.png and /dev/null differ
diff --git a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/plugins/MicroscopyTechnology.js b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/plugins/MicroscopyTechnology.js
index d0d3d304695147ff5716ba69fbf0b767dc535f28..6d3ba47ce6d3e13eda32d40fdbd8c53b9b37833b 100644
--- a/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/plugins/MicroscopyTechnology.js
+++ b/openbis_standard_technologies/dist/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/plugins/MicroscopyTechnology.js
@@ -193,7 +193,7 @@ $.extend(MicroscopyTechnology.prototype, ELNLIMSPlugin.prototype, {
             // we will replace it asynchronously.
             var thumbnailImage = $("<img />",
                 {
-                    src: "./img/wait.png",
+                    src: "./img/image_loading.gif",
                     class: "img-responsive",
                     display: "inline",
                     "text-align": "center",
@@ -296,7 +296,7 @@ $.extend(MicroscopyTechnology.prototype, ELNLIMSPlugin.prototype, {
                                 if (result.getTotalCount() == 0) {
 
                                     // Thumbnail not found!
-                                    imD.attr("src", "./img/error.png");
+                                    imD.attr("src", "./img/image_unavailable.png");
                                     imD.attr("title", "Could not find a thumbnail for this dataset!");
 
                                     return;