diff --git a/sanofi/dist/etc/sanofi-dropbox/sanofi-dropbox.py b/sanofi/dist/etc/sanofi-dropbox/sanofi-dropbox.py
index b6cbeb3804f5196d201a04611ad4bd3b8d3e6b0f..53bbcaa6bdc7cca56788618ba3c74af316c59be0 100644
--- a/sanofi/dist/etc/sanofi-dropbox/sanofi-dropbox.py
+++ b/sanofi/dist/etc/sanofi-dropbox/sanofi-dropbox.py
@@ -1,21 +1,60 @@
-import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.MaterialIdentifierCollection as MaterialIdentifierCollection
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria as SearchCriteria 
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause as MatchClause 
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute as MatchClauseAttribute 
-import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ScreeningConstants as ScreeningConstants
+from ch.systemsx.cisd.common.mail import From
+
+from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria 
+from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria import MatchClause, MatchClauseAttribute
+from ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1 import MaterialIdentifierCollection
+ 
+from ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto import ScreeningConstants
 
 PLATE_TYPE = "PLATE"
 
 DATA_SET_TYPE = "HCS_IMAGE_RAW"
 DATA_SET_BATCH_PROPNAME = "ACQUISITION_BATCH"
 
-registeredDataSets = []
+OPENBIS_URL = "https://bwl27.sanofi-aventis.com:8443/openbis"
+
+EXPERIMENT_RECIPIENTS_PROPNAME = "EMAIL_RECIPIENTS"
+DEFAULT_RECIPIENT_LIST = "Matthew.Smicker@sanofi-aventis.com"
+
+def rollback_transaction(service, transaction, runner, ex):
+    plateLink = createPlateLink(OPENBIS_URL, plate.getCode())
+    errorMessage = ex.getMessage()
+    sendEmail("openBIS: Data registration failed", """
+    
+    Dear Mr./Mrs.
+    
+      Registering new data for plate %(plateLink)s has failed with error '%(errorMessage)s'.
+      
+    openBIS
+    """ % vars())
+
+def commit_transaction(service, transaction):
+    plateLink = createPlateLink(OPENBIS_URL, plate.getCode())
+    sendEmail("openBIS: New data registered", """
+    
+    Dear Mr./Mrs.
+    
+      New data for the plate %(plateLink)s has been registered.
+      
+      Have a nice day!
+      
+    openBIS
+    """ % vars())
 
-def rollback_transaction(service, tr, runner, ex):
-    pass
+def sendEmail(title, content):
+    if experiment is not None:
+       recipientsProp = experiment.getPropertyValue(EXPERIMENT_RECIPIENTS_PROPNAME)
+        
+    if not recipientsProp:
+        recipientsProp = DEFAULT_RECIPIENT_LIST
+    
+    recipients = [ email.strip() for email in recipientsProp.split(",") ]
+    fromAddress = From("openbis@sanofi-aventis.com")
+    replyTo = None
+    state.mailClient.sendMessage(title, content, replyTo, fromAddress, recipients)
 
-def commit_transaction(service, tr):
-    pass
+def createPlateLink(openbisUrl, code):
+    return "<a href='%(openbisUrl)s#entity=SAMPLE&sample_type=PLATE&action=SEARCH&code=%(code)s'>%(code)s</a>" % vars()
 
 def findPlateByCode(code):
     """
@@ -105,8 +144,6 @@ class PlateInitializer:
                 "Plate geometry (width=%i) does not agree with LIBRARY_TEMPLATE (line=%i,width=%i)." % (plateWidth, i, len(csvLists[i]))
         
     def parseLibraryTemplate(self):
-        experimentId = plate.getExperiment().getExperimentIdentifier()
-        experiment = transaction.getExperiment(experimentId)
         template = experiment.getPropertyValue(self.LIBRARY_TEMPLATE_PROPNAME)
         
         csvLists = [ line.split(",")  for line in template.splitlines() ]
@@ -231,6 +268,8 @@ dataSet = transaction.createNewDataSet(DATA_SET_TYPE)
 (batchName, barCode) = parseIncomingDirname(incoming.getName())
 dataSet.setPropertyValue(DATA_SET_BATCH_PROPNAME, batchName)
 plate = findPlateByCode(barCode)
+experimentId = plate.getExperiment().getExperimentIdentifier()
+experiment = transaction.getExperiment(experimentId)
 
 if len(plate.getContainedSamples()) == 0:
     plateInitializer = PlateInitializer(plate)
@@ -238,3 +277,5 @@ if len(plate.getContainedSamples()) == 0:
     
 dataSet.setSample(plate)
 transaction.moveFile(incoming.getAbsolutePath(), dataSet)
+
+commit_transaction(None, None)
\ No newline at end of file
diff --git a/sanofi/sourceTest/java/ch/systemsx/cisd/sanofi/dss/test/SanofiDropboxJythonTest.java b/sanofi/sourceTest/java/ch/systemsx/cisd/sanofi/dss/test/SanofiDropboxJythonTest.java
index 91757453906b13da254e6a0589e96499e4150f44..54ae5e3f7524277d6cb48f68d033ede3e3922f55 100644
--- a/sanofi/sourceTest/java/ch/systemsx/cisd/sanofi/dss/test/SanofiDropboxJythonTest.java
+++ b/sanofi/sourceTest/java/ch/systemsx/cisd/sanofi/dss/test/SanofiDropboxJythonTest.java
@@ -28,12 +28,15 @@ import java.util.Map;
 import java.util.Properties;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang.StringUtils;
 import org.jmock.Expectations;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.common.eodsql.MockDataSet;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
+import ch.systemsx.cisd.common.mail.From;
+import ch.systemsx.cisd.common.test.AssertionUtil;
 import ch.systemsx.cisd.common.test.RecordingMatcher;
 import ch.systemsx.cisd.etlserver.registrator.AbstractJythonDataSetHandlerTest;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria;
@@ -72,6 +75,11 @@ public class SanofiDropboxJythonTest extends AbstractJythonDataSetHandlerTest
 
     private static final String LIBRARY_TEMPLATE_PROPNAME = "LIBRARY_TEMPLATE";
 
+    private static final String EXPERIMENT_RECIPIENTS_PROPNAME = "EMAIL_RECIPIENTS";
+
+    private static final String[] EXPERIMENT_RECIPIENTS = new String[]
+        { "admin@sanofi.com", "mickey@mouse.org" };
+
     private static final String MATERIAL_TYPE = "COMPOUND_BATCH";
     
     private static final String POSITIVE_CONTROL_TYPE = "POSITIVE_CONTROL";
@@ -123,6 +131,7 @@ public class SanofiDropboxJythonTest extends AbstractJythonDataSetHandlerTest
                 new RecordingMatcher<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails>();
         final RecordingMatcher<ListMaterialCriteria> materialCriteria =
                 new RecordingMatcher<ListMaterialCriteria>();
+        final RecordingMatcher<String> email = new RecordingMatcher<String>();
         context.checking(new Expectations()
             {
                 {
@@ -153,6 +162,10 @@ public class SanofiDropboxJythonTest extends AbstractJythonDataSetHandlerTest
 
                     one(openBisService).performEntityOperations(with(atomicatOperationDetails));
                     will(returnValue(new AtomicEntityOperationResult()));
+
+                    one(mailClient).sendMessage(with(any(String.class)), with(email),
+                            with(aNull(String.class)), with(any(From.class)),
+                            with(equal(EXPERIMENT_RECIPIENTS)));
                 }
             });
 
@@ -182,6 +195,11 @@ public class SanofiDropboxJythonTest extends AbstractJythonDataSetHandlerTest
         assertEquals(DATA_SET_CODE, dataSet.getCode());
         assertEquals(DATA_SET_TYPE, dataSet.getDataSetType());
 
+        AssertionUtil
+                .assertContains(
+                        "New data for the plate <a href='https://bwl27.sanofi-aventis.com:8443/openbis#entity=SAMPLE"
+                                + "&sample_type=PLATE&action=SEARCH&code=TEST-PLATE'>TEST-PLATE</a> has been registered.",
+                        email.recordedObject());
         context.assertIsSatisfied();
     }
 
@@ -291,6 +309,8 @@ public class SanofiDropboxJythonTest extends AbstractJythonDataSetHandlerTest
         ExperimentBuilder experimentBuilder = new ExperimentBuilder();
         experimentBuilder.identifier(EXPERIMENT_IDENTIFIER);
         experimentBuilder.property(LIBRARY_TEMPLATE_PROPNAME, libraryTemplate);
+        String recipients = StringUtils.join(Arrays.asList(EXPERIMENT_RECIPIENTS), ",");
+        experimentBuilder.property(EXPERIMENT_RECIPIENTS_PROPNAME, recipients);
 
         SampleBuilder sampleBuilder = new SampleBuilder();
         sampleBuilder.experiment(experimentBuilder.getExperiment());