diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/EmailBuilder.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/EmailSender.java
similarity index 50%
rename from datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/EmailBuilder.java
rename to datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/EmailSender.java
index 9cea5467365432173ef4e46238ab9ae12bfff0de..0705f96eb4fc8d6901b57c3c4fca6e6f8aaba829 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/EmailBuilder.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/EmailSender.java
@@ -16,13 +16,19 @@
 
 package ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython;
 
-import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.api.IEmailBuilder;
+import java.io.IOException;
+
+import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
+import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.MailService.IEmailSenderService;
+import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.api.IEmailSender;
 
 /**
  * @author Piotr Buczek
  */
-public class EmailBuilder implements IEmailBuilder
+public class EmailSender implements IEmailSender
 {
+    private final IEmailSenderService service;
+
     private String subject;
 
     private String bodyText;
@@ -35,25 +41,28 @@ public class EmailBuilder implements IEmailBuilder
 
     private String attachmentTextOrNull;
 
-    public EmailBuilder(String defaultSubject, String defaultBodyText)
+    public EmailSender(IEmailSenderService service, String defaultSubject, String defaultBodyText)
     {
+        this.service = service;
         this.subject = defaultSubject;
         this.bodyText = defaultBodyText;
     }
 
-    public IEmailBuilder withSubject(String aSubject)
+    // builder
+
+    public IEmailSender withSubject(String aSubject)
     {
         this.subject = aSubject;
         return this;
     }
 
-    public IEmailBuilder withBody(String aBodyText)
+    public IEmailSender withBody(String aBodyText)
     {
         this.bodyText = aBodyText;
         return this;
     }
 
-    public IEmailBuilder withAttachedFile(String filePath, String attachmentName)
+    public IEmailSender withAttachedFile(String filePath, String attachmentName)
     {
         if (attachmentTextOrNull != null)
         {
@@ -64,7 +73,7 @@ public class EmailBuilder implements IEmailBuilder
         return this;
     }
 
-    public IEmailBuilder withAttachedText(String text, String attachmentName)
+    public IEmailSender withAttachedText(String text, String attachmentName)
     {
         if (attachmentFilePathOrNull != null)
         {
@@ -75,29 +84,36 @@ public class EmailBuilder implements IEmailBuilder
         return this;
     }
 
-    public String getSubject()
-    {
-        return subject;
-    }
+    // sender
 
-    public String getBodyText()
+    public void send()
     {
-        return bodyText;
-    }
-
-    public String tryGetAttachmentName()
-    {
-        return attachmentNameOrNull;
-    }
-
-    public String tryGetAttachmentFilePath()
-    {
-        return attachmentFilePathOrNull;
-    }
-
-    public String tryGetAttachmentText()
-    {
-        return attachmentTextOrNull;
+        try
+        {
+            if (attachmentNameOrNull == null)
+            {
+                service.trySendEmail(subject, bodyText);
+            } else
+            {
+                if (attachmentFilePathOrNull != null)
+                {
+                    service.trySendEmailWithFileAttachment(subject, bodyText, attachmentNameOrNull,
+                            attachmentFilePathOrNull);
+                } else if (attachmentTextOrNull != null)
+                {
+                    service.trySendEmailWithTextAttachment(subject, bodyText, attachmentNameOrNull,
+                            attachmentTextOrNull);
+                } else
+                {
+                    // in general it shouldn't happen unless the script put None as an argument
+                    throw new IllegalStateException(
+                            "Neither file path nor text of attachment was specified");
+                }
+            }
+        } catch (IOException ex)
+        {
+            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
+        }
     }
 
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/api/IEmailBuilder.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/IEmailBuilderWithGetters.java
similarity index 70%
rename from datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/api/IEmailBuilder.java
rename to datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/IEmailBuilderWithGetters.java
index 56ad19e7487e6707170dae862aacce9e0ce6776f..e84c050396cb5f56077813008f459b75b5b6b073 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/api/IEmailBuilder.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/IEmailBuilderWithGetters.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.api;
+package ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython;
 
 /**
  * Builder of emails with attachments.
@@ -22,13 +22,13 @@ package ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.api;
  * @author Piotr Buczek
  */
 // NOTE: All methods of this interface are part of the Reporting and Processing Plugin API.
-public interface IEmailBuilder
+public interface IEmailBuilderWithGetters
 {
-    IEmailBuilder withSubject(String subject);
+    IEmailBuilderWithGetters withSubject(String subject);
 
-    IEmailBuilder withBody(String bodyText);
+    IEmailBuilderWithGetters withBody(String bodyText);
 
-    IEmailBuilder withAttachedFile(String attachmentFilePath, String attachmentName);
+    IEmailBuilderWithGetters withAttachedFile(String attachmentFilePath, String attachmentName);
 
-    IEmailBuilder withAttachedText(String attachmentText, String attachmentName);
+    IEmailBuilderWithGetters withAttachedText(String attachmentText, String attachmentName);
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/MailService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/MailService.java
index c4921227bc0fe7a090758f45851ba9f095ec0be2..1a5cd6cc4f325c056097a5679837b649f2a9cdee 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/MailService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/MailService.java
@@ -23,10 +23,9 @@ import javax.activation.DataHandler;
 import javax.activation.DataSource;
 import javax.mail.util.ByteArrayDataSource;
 
-import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.common.mail.EMailAddress;
 import ch.systemsx.cisd.common.mail.IMailClient;
-import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.api.IEmailBuilder;
+import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.api.IEmailSender;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.api.IMailService;
 
 import de.schlichtherle.io.FileInputStream;
@@ -40,93 +39,75 @@ public class MailService implements IMailService
 
     static String DEFAULT_BODY_TEXT = "";
 
-    private final IMailClient mailClient;
-
-    private final String recipientAddressOrNull;
+    private final IEmailSenderService senderService;
 
     private final String defaultSubject;
 
     private final String defaultBodyText;
 
-    public MailService(IMailClient mailClient, String recipientAddressOrNull)
+    public MailService(IMailClient mailClient, String recipientAddress)
     {
-        this(mailClient, recipientAddressOrNull, DEFAULT_SUBJECT, DEFAULT_BODY_TEXT);
+        this(mailClient, recipientAddress, DEFAULT_SUBJECT, DEFAULT_BODY_TEXT);
     }
 
-    public MailService(IMailClient mailClient, String recipientAddressOrNull,
-            String defaultSubject, String defaultBodyText)
+    public MailService(IMailClient mailClient, String recipientAddress, String defaultSubject,
+            String defaultBodyText)
     {
-        this.mailClient = mailClient;
-        this.recipientAddressOrNull = recipientAddressOrNull;
+        assert recipientAddress != null;
+        this.senderService = createEmailSenderService(mailClient, recipientAddress);
         this.defaultSubject = defaultSubject;
         this.defaultBodyText = defaultBodyText;
     }
 
-    public IEmailBuilder createEmailBuilder()
+    public IEmailSender createEmailSender()
     {
-        return new EmailBuilder(defaultSubject, defaultBodyText);
+        return new EmailSender(senderService, defaultSubject, defaultBodyText);
     }
 
-    public void sendEmail(IEmailBuilder emailBuilder)
+    static IEmailSenderService createEmailSenderService(final IMailClient mailClient,
+            final String recipientAddress)
     {
-        assert emailBuilder instanceof EmailBuilder;
-
-        final EmailBuilder builder = (EmailBuilder) emailBuilder;
-        String subject = builder.getSubject();
-        String bodyText = builder.getBodyText();
-        String attachmentFileNameOrNull = builder.tryGetAttachmentName();
-        EMailAddress recipient = new EMailAddress(recipientAddressOrNull);
-        try
-        {
-            if (attachmentFileNameOrNull == null)
-            {
-                trySendEmail(subject, bodyText, recipient);
-            } else
+        final EMailAddress recipient = new EMailAddress(recipientAddress);
+        return new IEmailSenderService()
             {
-                String attachmentFilePathOrNull = builder.tryGetAttachmentFilePath();
-                String attachmentTextOrNull = builder.tryGetAttachmentText();
-                if (attachmentFilePathOrNull != null)
+
+                public void trySendEmail(String subject, String bodyText)
                 {
-                    trySendEmailWithFileAttachment(subject, bodyText, attachmentFileNameOrNull,
-                            attachmentFilePathOrNull, recipient);
-                } else if (attachmentTextOrNull != null)
+                    mailClient.sendEmailMessage(subject, bodyText, null, null, recipient);
+                }
+
+                public void trySendEmailWithTextAttachment(String subject, String bodyText,
+                        String attachmentFileName, String attachmentText) throws IOException
                 {
-                    trySendEmailWithTextAttachment(subject, bodyText, attachmentFileNameOrNull,
-                            attachmentTextOrNull, recipient);
-                } else
+                    DataSource dataSource = new ByteArrayDataSource(attachmentText, "text/plain");
+                    mailClient.sendEmailMessageWithAttachment(subject, bodyText,
+                            attachmentFileName, new DataHandler(dataSource), null, null, recipient);
+                }
+
+                public void trySendEmailWithFileAttachment(String subject, String bodyText,
+                        String attachmentFileName, String attachmentFilePath)
+                        throws FileNotFoundException, IOException
                 {
-                    // in general it shouldn't happen unless the script put None as an argument
-                    throw new IllegalStateException(
-                            "Neither file path nor text of attachment was specified");
+                    DataSource dataSource =
+                            new ByteArrayDataSource(new FileInputStream(attachmentFilePath),
+                                    "text/plain");
+                    mailClient.sendEmailMessageWithAttachment(subject, bodyText,
+                            attachmentFileName, new DataHandler(dataSource), null, null, recipient);
                 }
-            }
-        } catch (IOException ex)
-        {
-            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
-        }
-    }
 
-    private void trySendEmail(String subject, String bodyText, EMailAddress recipient)
-    {
-        mailClient.sendEmailMessage(subject, bodyText, null, null, recipient);
+            };
     }
 
-    private void trySendEmailWithTextAttachment(String subject, String bodyText,
-            String attachmentFileName, String attachmentText, EMailAddress recipient)
-            throws IOException
+    static interface IEmailSenderService
     {
-        DataSource dataSource = new ByteArrayDataSource(attachmentText, "text/plain");
-        mailClient.sendEmailMessageWithAttachment(subject, bodyText, attachmentFileName,
-                new DataHandler(dataSource), null, null, recipient);
-    }
+        void trySendEmail(String subject, String bodyText);
 
-    private void trySendEmailWithFileAttachment(String subject, String bodyText,
-            String attachmentFileName, String attachmentFilePath, EMailAddress recipient)
-            throws FileNotFoundException, IOException
-    {
-        DataSource dataSource =
-                new ByteArrayDataSource(new FileInputStream(attachmentFilePath), "text/plain");
-        mailClient.sendEmailMessageWithAttachment(subject, bodyText, attachmentFileName,
-                new DataHandler(dataSource), null, null, recipient);
+        void trySendEmailWithTextAttachment(String subject, String bodyText,
+                String attachmentFileName, String attachmentText) throws IOException;
+
+        void trySendEmailWithFileAttachment(String subject, String bodyText,
+                String attachmentFileName, String attachmentFilePath) throws FileNotFoundException,
+                IOException;
     }
+
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/ReportingBasedProcessingPlugin.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/ReportingBasedProcessingPlugin.java
index ef76494af48c6ddd90493bf2e431f2ad9519c792..3060d874332f842cbd490bef519aacc9abbb3a9d 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/ReportingBasedProcessingPlugin.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/ReportingBasedProcessingPlugin.java
@@ -28,7 +28,7 @@ import ch.systemsx.cisd.common.exceptions.Status;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.utilities.PropertyUtils;
-import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.api.IEmailBuilder;
+import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.api.IEmailSender;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.api.IMailService;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractTableModelReportingPlugin;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IProcessingPluginTask;
@@ -61,7 +61,7 @@ public class ReportingBasedProcessingPlugin implements IProcessingPluginTask
 
     private static final String ATTACHMENT_NAME = "attachment-name";
 
-    private static final String SINGLE_REPORT_FOR_ALL = "single-report-for-all";
+    private static final String SINGLE_REPORT = "single-report";
 
     private static final String DEFAULT_EMAIL_SUBJECT = MailService.DEFAULT_SUBJECT;
 
@@ -79,14 +79,13 @@ public class ReportingBasedProcessingPlugin implements IProcessingPluginTask
 
     private final String attachmentName;
 
-    private final boolean singleReportForAll;
+    private final boolean singleReport;
 
     public ReportingBasedProcessingPlugin(Properties properties, File storeRoot)
     {
         this.scriptPath = PropertyUtils.getMandatoryProperty(properties, SCRIPT_PATH);
-        this.singleReportForAll =
-                PropertyUtils.getBoolean(properties, SINGLE_REPORT_FOR_ALL,
-                        DEFAULT_SINGLE_REPORT_FOR_ALL);
+        this.singleReport =
+                PropertyUtils.getBoolean(properties, SINGLE_REPORT, DEFAULT_SINGLE_REPORT_FOR_ALL);
         this.emailSubject =
                 PropertyUtils.getProperty(properties, EMAIL_SUBJECT, DEFAULT_EMAIL_SUBJECT);
         this.emailBody = PropertyUtils.getProperty(properties, EMAIL_BODY, DEFAULT_EMAIL_BODY);
@@ -101,7 +100,7 @@ public class ReportingBasedProcessingPlugin implements IProcessingPluginTask
                 new MailService(context.getMailClient(), context.getUserEmailOrNull(),
                         emailSubject, emailBody);
         ProcessingStatus status = new ProcessingStatus();
-        if (singleReportForAll)
+        if (singleReport)
         {
             try
             {
@@ -135,9 +134,9 @@ public class ReportingBasedProcessingPlugin implements IProcessingPluginTask
     {
         TableModel table = createTableModel(dataSets, context);
         String tableAsString = AbstractTableModelReportingPlugin.convertTableToCsvString(table);
-        IEmailBuilder emailBuilder =
-                mailService.createEmailBuilder().withAttachedText(tableAsString, attachmentName);
-        mailService.sendEmail(emailBuilder);
+        IEmailSender emailBuilder =
+                mailService.createEmailSender().withAttachedText(tableAsString, attachmentName);
+        emailBuilder.send();
     }
 
     public TableModel createTableModel(List<DatasetDescription> dataSets,
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/api/IEmailSender.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/api/IEmailSender.java
new file mode 100644
index 0000000000000000000000000000000000000000..8621f821882352e6caa08de884a536222cfd174d
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/api/IEmailSender.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * 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.systemsx.cisd.openbis.dss.generic.server.plugins.jython.api;
+
+/**
+ * Builds and sender of an email with an optional attachment.
+ * 
+ * @author Piotr Buczek
+ */
+// NOTE: All methods of this interface are part of the Reporting and Processing Plugin API.
+public interface IEmailSender
+{
+    IEmailSender withSubject(String subject);
+
+    IEmailSender withBody(String bodyText);
+
+    IEmailSender withAttachedFile(String attachmentFilePath, String attachmentName);
+
+    IEmailSender withAttachedText(String attachmentText, String attachmentName);
+
+    void send();
+}
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/api/IMailService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/api/IMailService.java
index 0aaf4c414de5cbf7803d0d56a3ac52e6a4a95f6d..6db8ec868c1a047fb7895bd9b74c326efabb5e66 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/api/IMailService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/api/IMailService.java
@@ -17,16 +17,13 @@
 package ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.api;
 
 /**
- * Service for sending emails with attachments
+ * Service for creating and sending emails with attachments
  * 
  * @author Piotr Buczek
  */
 // NOTE: All methods of this interface are part of the Reporting and Processing Plugin API.
 public interface IMailService
 {
-    /** sends an email created by given email builder */
-    void sendEmail(IEmailBuilder emailBuilder);
-
-    /** @return an email builder */
-    IEmailBuilder createEmailBuilder();
+    /** @return an email sender (statefull, create a new one for every email to be sent) */
+    IEmailSender createEmailSender();
 }