diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java
index 94315a6abf8f39033875e2b25994b18f6ef31fe1..f153d20b7aa5c255f2d0637136d77503be668cd2 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java
@@ -16,11 +16,11 @@
 
 package ch.ethz.bsse.cisd.dsu.tracking.email;
 
+import ch.systemsx.cisd.common.mail.From;
 import ch.systemsx.cisd.common.mail.IMailClient;
 
 /**
- * Simple encapsulation of
- * {@link IMailClient#sendMessage(String, String, String, ch.systemsx.cisd.common.mail.From, String...)}
+ * Simple encapsulation of {@link IMailClient#sendMessage(String, String, String, From, String...)}
  * method parameters.
  * 
  * @author Piotr Buczek
@@ -33,11 +33,11 @@ public class Email
 
     private final String replyToOrNull;
 
-    private final String fromOrNull;
+    private final From fromOrNull;
 
     private final String[] recipients;
 
-    public Email(String subject, String content, String replyToOrNull, String fromOrNull,
+    public Email(String subject, String content, String replyToOrNull, From fromOrNull,
             String... recipients)
     {
         super();
@@ -48,6 +48,12 @@ public class Email
         this.recipients = recipients;
     }
 
+    public Email(String subject, String content, String replyToOrNull, String fromOrNull,
+            String... recipients)
+    {
+        this(subject, content, replyToOrNull, new From(fromOrNull), recipients);
+    }
+
     public String getSubject()
     {
         return subject;
@@ -63,7 +69,7 @@ public class Email
         return replyToOrNull;
     }
 
-    public String getFromOrNull()
+    public From getFromOrNull()
     {
         return fromOrNull;
     }
diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EmailWithSummary.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EmailWithSummary.java
new file mode 100644
index 0000000000000000000000000000000000000000..ae91239a0c783ab6967cf46800115855f25cfade
--- /dev/null
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EmailWithSummary.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2009 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.ethz.bsse.cisd.dsu.tracking.email;
+
+/**
+ * Encapsulation of {@link Email} with a short summary of its content.
+ * 
+ * @author Piotr Buczek
+ */
+public class EmailWithSummary
+{
+    private final Email email;
+
+    private final String summary;
+
+    public EmailWithSummary(Email email, String summary)
+    {
+        this.email = email;
+        this.summary = summary;
+    }
+
+    public Email getEmail()
+    {
+        return email;
+    }
+
+    public String getSummary()
+    {
+        return summary;
+    }
+
+}
diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java
index b95d70da38471faab5d3040581096264d9418906..83c15ecb91602ff4294e15e9422c15c83f6b62aa 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java
@@ -71,7 +71,7 @@ public class EntityTrackingEmailData
     }
 
     // data grouped by sequencing sample: <sequencing sample id, data>
-    private final Map<Long, SequencingSampleData> sequencingSampleData =
+    private final Map<Long, SequencingSampleData> sequencingSampleDataById =
             new HashMap<Long, SequencingSampleData>(0);
 
     private final List<ExternalData> dataSets = new ArrayList<ExternalData>(0);
@@ -91,7 +91,7 @@ public class EntityTrackingEmailData
 
     public Collection<SequencingSampleData> getSequencingSamplesData()
     {
-        return sequencingSampleData.values();
+        return sequencingSampleDataById.values();
     }
 
     public List<ExternalData> getDataSets()
@@ -112,7 +112,7 @@ public class EntityTrackingEmailData
         final Sample sequencingSample = flowLaneSample.getGeneratedFrom();
         assert sequencingSample != null;
 
-        SequencingSampleData infoOrNull = sequencingSampleData.get(sequencingSample.getId());
+        SequencingSampleData infoOrNull = sequencingSampleDataById.get(sequencingSample.getId());
         if (infoOrNull == null)
         {
             // because sequencing samples are processed before flow lane samples
@@ -127,7 +127,7 @@ public class EntityTrackingEmailData
             boolean newlyTracked)
     {
         final SequencingSampleData data = new SequencingSampleData(sequencingSample, newlyTracked);
-        sequencingSampleData.put(sequencingSample.getId(), data);
+        sequencingSampleDataById.put(sequencingSample.getId(), data);
         return data;
     }
 
@@ -137,4 +137,58 @@ public class EntityTrackingEmailData
         dataSets.add(dataSet);
     }
 
+    /** short description of data kept in the structure */
+    public String getDescription()
+    {
+        final StringBuilder sb = new StringBuilder();
+
+        // append info about tracked samples
+        if (getSequencingSamplesData().isEmpty())
+        {
+            sb.append("no new samples tracked");
+        } else
+        {
+            for (SequencingSampleData seqencingSampleData : getSequencingSamplesData())
+            {
+                final int flowLaneSamplesSize = seqencingSampleData.getFlowLaneSamples().size();
+                final String sequencingSampleIdentifier =
+                        seqencingSampleData.getSequencingSample().getIdentifier();
+                final boolean newlyTracked = seqencingSampleData.isNewlyTracked();
+                sb.append(String.format(
+                        "%sSequencing sample: '%s' with %d new Flow Lane samples tracked",
+                        newlyTracked ? "new " : "", sequencingSampleIdentifier,
+                        flowLaneSamplesSize, flowLaneSamplesSize > 0 ? ": " : ""));
+                for (Sample flowLaneSample : seqencingSampleData.getFlowLaneSamples())
+                {
+                    sb.append(flowLaneSample.getIdentifier() + ", ");
+                }
+            }
+        }
+        sb.append("\n");
+        // append info about tracked data sets
+        if (getDataSets().isEmpty())
+        {
+            sb.append("no new data sets tracked");
+        } else
+        {
+            sb.append(getDataSets().size() + " new data set(s) tracked: ");
+            for (ExternalData dataSet : getDataSets())
+            {
+                sb.append(dataSet.getIdentifier() + ", ");
+            }
+        }
+        sb.append("\n");
+        return sb.toString();
+    }
+
+    //
+    // Object
+    //
+
+    @Override
+    public String toString()
+    {
+        return getDescription();
+    }
+
 }
diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java
index 91066093d21e262a657220c6ac5103cc4fe6424d..2a0b97a631fd48e002f0d7a239911f9c29ae0679 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java
@@ -86,20 +86,25 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat
         return result;
     }
 
-    public List<Email> generateEmails(TrackedEntities trackedEntities)
+    public List<EmailWithSummary> generateEmails(TrackedEntities trackedEntities)
     {
         final Collection<EntityTrackingEmailData> emailDataGroupedByRecipient =
                 EntityTrackingEmailDataManager.groupByRecipient(trackedEntities);
 
-        final List<Email> results = new ArrayList<Email>();
+        final List<EmailWithSummary> results = new ArrayList<EmailWithSummary>();
         for (EntityTrackingEmailData emailData : emailDataGroupedByRecipient)
         {
-            results.add(createEmail(emailData));
+            results.add(createEmailWithSummary(emailData));
         }
 
         return results;
     }
 
+    private EmailWithSummary createEmailWithSummary(EntityTrackingEmailData emailData)
+    {
+        return new EmailWithSummary(createEmail(emailData), emailData.getDescription());
+    }
+
     private Email createEmail(EntityTrackingEmailData emailData)
     {
         String content = EmailContentGenerator.fillTemplateWithData(template, emailData);
diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java
index 812d6168575874908b51ae8b92d8e15be2fd038e..19c650ff288ce64a6cc694a36c5526871d0d9f36 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java
@@ -26,10 +26,10 @@ import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities;
 public interface IEntityTrackingEmailGenerator
 {
     /**
-     * Generates all {@link Email}s to be send containing information about
+     * Generates all {@link EmailWithSummary}s to be send containing information about
      * <var>trackedEntities</var>.
      * 
      * @param trackedEntities recently tracked entities
      */
-    List<Email> generateEmails(TrackedEntities trackedEntities);
+    List<EmailWithSummary> generateEmails(TrackedEntities trackedEntities);
 }
diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java
index 4a25c9fc885390dfe66b5799b0e682b2c5f698b0..56469105863c73333f0863b8b29257b9a8878dd7 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java
@@ -21,6 +21,7 @@ import java.util.List;
 import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities;
 import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackingStateDTO;
 import ch.ethz.bsse.cisd.dsu.tracking.email.Email;
+import ch.ethz.bsse.cisd.dsu.tracking.email.EmailWithSummary;
 import ch.ethz.bsse.cisd.dsu.tracking.email.IEntityTrackingEmailGenerator;
 import ch.ethz.bsse.cisd.dsu.tracking.utils.LogUtils;
 import ch.systemsx.cisd.common.collections.CollectionUtils;
@@ -63,75 +64,87 @@ public class TrackingBO
 
         TrackedEntities changedEntities =
                 fetchChangedEntities(prevTrackingState, trackingServer, session);
-        List<Email> emails = emailGenerator.generateEmails(changedEntities);
-        sendEmails(emails, mailClient);
+        List<EmailWithSummary> emailsWithSummary = emailGenerator.generateEmails(changedEntities);
+        sendEmails(emailsWithSummary, mailClient);
         saveTrackingState(changedEntities, trackingDAO);
     }
 
-    private static void sendEmails(List<Email> emails, IMailClient mailClient)
+    private static void sendEmails(List<EmailWithSummary> emailsWithSummary, IMailClient mailClient)
     {
-        for (Email email : emails)
+        for (EmailWithSummary emailWithSummary : emailsWithSummary)
         {
             try
             {
-                From from = tryGetFromField(email);
-                String[] recipients = email.getRecipients();
-                String content = email.getContent();
-                String subject = email.getSubject();
-                String replyToOrNull = email.getReplyToOrNull();
-                sendMessage(mailClient, subject, content, replyToOrNull, from, recipients);
+                sendMessage(mailClient, emailWithSummary);
             } catch (Exception ex)
             {
-                sendErrorReport(mailClient, ex, email);
+                sendErrorReport(mailClient, ex, emailWithSummary);
             }
         }
     }
 
-    private static From tryGetFromField(Email email)
-    {
-        return (email.getFromOrNull() == null) ? null : new From(email.getFromOrNull());
-    }
-
     // This email could not be sent, most probably the recipient addresses were
     // incorrect.
     // We send the email to the administrator "replyTo' address, the admin should
     // forward it to the right recipient.
-    private static void sendErrorReport(IMailClient mailClient, Exception exception, Email email)
+    private static void sendErrorReport(IMailClient mailClient, Exception exception,
+            EmailWithSummary emailWithSummary)
     {
-        StringBuffer errorReportContent = new StringBuffer();
-        appendLine(errorReportContent, "Dear openBIS Admin,");
-        appendLine(errorReportContent,
+        Email email = emailWithSummary.getEmail();
+
+        StringBuilder errorReportContentBuilder = new StringBuilder();
+        appendLine(errorReportContentBuilder, "Dear openBIS Admin,");
+        appendLine(errorReportContentBuilder,
                 "This email has been generated automatically from the openBIS Changes Tracking system.");
-        appendLine(errorReportContent, "There was a failure while trying to send the email:");
-        appendLine(errorReportContent, exception.getMessage());
-        appendLine(errorReportContent,
+        appendLine(errorReportContentBuilder, "There was a failure while trying to send the email:");
+        appendLine(errorReportContentBuilder, exception.getMessage());
+        appendLine(errorReportContentBuilder,
                 "The possible reason is that the recipient address is not valid.");
-        appendLine(errorReportContent,
+        appendLine(errorReportContentBuilder,
                 "If you know the address of the recipient please correct it and forward this email to him.");
-        appendLine(errorReportContent,
+        appendLine(errorReportContentBuilder,
                 "!!! Note that the Tracking System will not try to send this email again !!!");
-        appendLine(errorReportContent,
+        appendLine(errorReportContentBuilder,
                 "Please correct the recipient email address in openBIS to avoid similar problems in future.");
-        appendLine(errorReportContent, "");
-        appendLine(errorReportContent, "Subject:    " + email.getSubject());
-        appendLine(errorReportContent, "Recipients: "
+        appendLine(errorReportContentBuilder, "");
+        appendLine(errorReportContentBuilder, "Subject:    " + email.getSubject());
+        appendLine(errorReportContentBuilder, "Recipients: "
                 + CollectionUtils.abbreviate(email.getRecipients(), -1));
-        appendLine(errorReportContent, "");
-        appendLine(errorReportContent, "Original content:");
+        appendLine(errorReportContentBuilder, "");
 
-        sendMessage(mailClient, "[Tracking] Sending an email failed",
-                errorReportContent.toString(), null, tryGetFromField(email), email
-                        .getReplyToOrNull());
+        StringBuilder errorReportSummaryBuilder =
+                new StringBuilder(errorReportContentBuilder.toString());
+
+        appendLine(errorReportContentBuilder, "Original content: ");
+        appendLine(errorReportContentBuilder, email.getContent());
+        String errorReportContent = errorReportContentBuilder.toString();
+
+        appendLine(errorReportSummaryBuilder, "Original content summary: ");
+        appendLine(errorReportSummaryBuilder, emailWithSummary.getSummary());
+        String errorReportSummary = errorReportSummaryBuilder.toString();
+
+        Email errorReportEmail =
+                new Email("[Tracking] Sending an email failed", errorReportContent, null, email
+                        .getFromOrNull(), email.getReplyToOrNull());
+        sendMessage(mailClient, new EmailWithSummary(errorReportEmail, errorReportSummary));
     }
 
-    private static void sendMessage(IMailClient mailClient, String subject, String content,
-            String replyToOrNull, From fromOrNull, String... recipients)
+    private static void sendMessage(IMailClient mailClient, EmailWithSummary emailWithSummary)
     {
+        Email email = emailWithSummary.getEmail();
+        String summary = emailWithSummary.getSummary();
+
+        String subject = email.getSubject();
+        String content = email.getContent();
+        String replyToOrNull = email.getReplyToOrNull();
+        From fromOrNull = email.getFromOrNull();
+        String[] recipients = email.getRecipients();
         mailClient.sendMessage(subject, content, replyToOrNull, fromOrNull, recipients);
-        LogUtils.debug("Sending an email [" + subject + "]\n" + content);
+
+        LogUtils.debug("Sending an email [" + subject + "]\n" + summary);
     }
 
-    private static void appendLine(StringBuffer sb, String msg)
+    private static void appendLine(StringBuilder sb, String msg)
     {
         sb.append(msg);
         sb.append("\n");