You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2019/10/18 06:40:47 UTC

[james-project] 14/17: JAMES-2813 add a timestamp on every AdditionalInformation

This is an automated email from the ASF dual-hosted git repository.

rouazana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 139e70c0a7569369616c2bf403c7c112aeb89320
Author: RĂ©mi KOWALSKI <rk...@linagora.com>
AuthorDate: Thu Oct 17 10:56:42 2019 +0200

    JAMES-2813 add a timestamp on every AdditionalInformation
---
 .../cassandra/migration/MigrationTask.java         | 13 +++++--
 .../MigrationTaskAdditionalInformationsDTO.java    | 16 +++++++--
 .../migration/MigrationTaskSerializationTest.java  |  8 +++--
 .../apache/james/json/JsonGenericSerializer.java   |  2 ++
 .../mail/migration/MailboxPathV2Migration.java     | 13 +++++--
 ...athV2MigrationTaskAdditionalInformationDTO.java | 18 ++++++++--
 .../cassandra/mail/task/MailboxMergingTask.java    | 14 ++++++--
 ...MailboxMergingTaskAdditionalInformationDTO.java | 18 ++++++++--
 ...ailboxPathV2MigrationTaskSerializationTest.java |  6 ++--
 .../mail/task/MailboxMergingTaskTest.java          |  6 ++--
 .../blob/BlobStoreVaultGarbageCollectionTask.java  | 13 +++++--
 ...bageCollectionTaskAdditionalInformationDTO.java | 17 +++++++--
 ...aultGarbageCollectionTaskSerializationTest.java |  6 ++--
 .../tools/indexer/MessageIdReIndexingTask.java     | 13 +++++--
 ...geIdReindexingTaskAdditionalInformationDTO.java | 22 +++++++++---
 .../indexer/ReprocessingContextInformation.java    | 25 ++++++++++++--
 .../indexer/ReprocessingContextInformationDTO.java | 40 +++++++++++++++++-----
 .../tools/indexer/SingleMailboxReindexingTask.java |  9 +++--
 ...lboxReindexingTaskAdditionalInformationDTO.java | 23 ++++++++++---
 .../tools/indexer/SingleMessageReindexingTask.java | 13 +++++--
 ...sageReindexingTaskAdditionalInformationDTO.java | 25 +++++++++++---
 .../mailbox/tools/indexer/UserReindexingTask.java  |  9 +++--
 ...UserReindexingTaskAdditionalInformationDTO.java | 22 +++++++++---
 ...rorRecoveryIndexationTaskSerializationTest.java |  8 +++--
 .../FullReindexingTaskSerializationTest.java       |  9 +++--
 .../MessageIdReindexingTaskSerializationTest.java  |  9 +++--
 ...ngleMailboxReindexingTaskSerializationTest.java |  9 +++--
 ...ngleMessageReindexingTaskSerializationTest.java |  9 +++--
 .../UserReindexingTaskSerializationTest.java       |  9 +++--
 .../james/modules/TaskSerializationModule.java     |  4 ++-
 .../migration/MappingsSourcesMigration.java        | 14 ++++++--
 ...urcesMigrationTaskAdditionalInformationDTO.java | 25 ++++++++++----
 ...pingsSourcesMigrationTaskSerializationTest.java |  6 ++--
 .../routes/DeletedMessagesVaultDeleteTask.java     | 13 +++++--
 ...gesVaultDeleteTaskAdditionalInformationDTO.java | 16 +++++++--
 .../routes/DeletedMessagesVaultExportTask.java     | 14 ++++++--
 ...gesVaultExportTaskAdditionalInformationDTO.java | 18 ++++++++--
 .../routes/DeletedMessagesVaultRestoreTask.java    | 13 +++++--
 ...esVaultRestoreTaskAdditionalInformationDTO.java | 18 ++++++++--
 ...edMessagesVaultDeleteTaskSerializationTest.java |  9 +++--
 ...edMessagesVaultExportTaskSerializationTest.java |  7 ++--
 ...dMessagesVaultRestoreTaskSerializationTest.java |  7 ++--
 .../service/EventDeadLettersRedeliverAllTask.java  |  4 ++-
 .../EventDeadLettersRedeliverGroupTask.java        |  4 ++-
 .../service/EventDeadLettersRedeliverOneTask.java  |  7 ++--
 ...LettersRedeliveryTaskAdditionalInformation.java | 15 ++++++--
 ...tersRedeliveryTaskAdditionalInformationDTO.java | 40 ++++++++++++++++------
 .../service/EventDeadLettersRedeliverTaskTest.java | 14 ++++----
 .../james/webadmin/service/ClearMailQueueTask.java | 13 +++++--
 ...ClearMailQueueTaskAdditionalInformationDTO.java | 18 ++++++++--
 .../service/DeleteMailsFromMailQueueTask.java      | 13 +++++--
 ...sFromMailQueueTaskAdditionalInformationDTO.java | 17 +++++++--
 .../webadmin/service/ClearMailQueueTaskTest.java   |  8 +++--
 .../service/DeleteMailsFromMailQueueTaskTest.java  | 12 ++++---
 .../webadmin/routes/MailRepositoriesRoutes.java    |  3 +-
 .../webadmin/service/ClearMailRepositoryTask.java  | 13 +++++--
 ...MailRepositoryTaskAdditionalInformationDTO.java | 17 +++++++--
 .../webadmin/service/ReprocessingAllMailsTask.java | 13 +++++--
 ...essingAllMailsTaskAdditionalInformationDTO.java | 16 +++++++--
 .../webadmin/service/ReprocessingOneMailTask.java  | 19 ++++++++--
 ...cessingOneMailTaskAdditionalInformationDTO.java | 16 +++++++--
 .../service/ReprocessingOneMailTaskDTO.java        | 10 +++---
 .../service/ClearMailRepositoryTaskTest.java       | 10 ++++--
 .../service/ReprocessingAllMailsTaskTest.java      | 11 +++---
 .../service/ReprocessingOneMailTaskTest.java       | 22 +++++++-----
 .../apache/james/task/TaskExecutionDetails.scala   |  6 ++--
 .../james/task/MemoryReferenceWithCounterTask.java | 19 +++++++---
 .../distributed/TaskEventsSerializationTest.java   | 12 ++++---
 .../task/json/dto/AdditionalInformationDTO.java    |  4 +++
 ...nceWithCounterTaskAdditionalInformationDTO.java | 17 +++++++--
 .../org/apache/james/task/MemoryTaskManager.java   |  1 -
 .../EventSourcingTaskManagerTest.java              |  1 +
 .../task/eventsourcing/TaskAggregateTest.java      | 18 +++++-----
 .../TaskExecutionDetailsProjectionContract.java    |  1 -
 .../james/task/TaskExecutionDetailsFixture.scala   |  8 +++--
 75 files changed, 743 insertions(+), 227 deletions(-)

diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTask.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTask.java
index fafb144..8c6dcf6 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTask.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTask.java
@@ -21,6 +21,8 @@ package org.apache.james.backends.cassandra.migration;
 
 import static org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager.DEFAULT_VERSION;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 
 import javax.inject.Inject;
@@ -68,14 +70,21 @@ public class MigrationTask implements Task {
     public static class AdditionalInformations implements TaskExecutionDetails.AdditionalInformation {
 
         private final SchemaVersion toVersion;
+        private final Instant timestamp;
 
-        public AdditionalInformations(SchemaVersion toVersion) {
+        public AdditionalInformations(SchemaVersion toVersion, Instant timestamp) {
             this.toVersion = toVersion;
+            this.timestamp = timestamp;
         }
 
         public int getToVersion() {
             return toVersion.getValue();
         }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
     private final CassandraSchemaVersionDAO schemaVersionDAO;
@@ -148,7 +157,7 @@ public class MigrationTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(new AdditionalInformations(target));
+        return Optional.of(new AdditionalInformations(target, Clock.systemUTC().instant()));
     }
 
 }
diff --git a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTaskAdditionalInformationsDTO.java b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTaskAdditionalInformationsDTO.java
index de18a05..1b68a38 100644
--- a/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTaskAdditionalInformationsDTO.java
+++ b/backends-common/cassandra/src/main/java/org/apache/james/backends/cassandra/migration/MigrationTaskAdditionalInformationsDTO.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.backends.cassandra.migration;
 
+import java.time.Instant;
+
 import org.apache.james.backends.cassandra.versions.SchemaVersion;
 import org.apache.james.json.DTOModule;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
@@ -30,18 +32,22 @@ public class MigrationTaskAdditionalInformationsDTO implements AdditionalInforma
     public static final AdditionalInformationDTOModule<MigrationTask.AdditionalInformations, MigrationTaskAdditionalInformationsDTO> serializationModule() {
         return DTOModule.forDomainObject(MigrationTask.AdditionalInformations.class)
             .convertToDTO(MigrationTaskAdditionalInformationsDTO.class)
-            .toDomainObjectConverter(dto -> new MigrationTask.AdditionalInformations(new SchemaVersion(dto.getTargetVersion())))
-            .toDTOConverter((details, type) -> new MigrationTaskAdditionalInformationsDTO(type, details.getToVersion()))
+            .toDomainObjectConverter(dto -> new MigrationTask.AdditionalInformations(new SchemaVersion(dto.getTargetVersion()), dto.timestamp))
+            .toDTOConverter((details, type) -> new MigrationTaskAdditionalInformationsDTO(type, details.getToVersion(), details.timestamp()))
             .typeName(MigrationTask.CASSANDRA_MIGRATION.asString())
             .withFactory(AdditionalInformationDTOModule::new);
     }
 
     private final String type;
     private final int targetVersion;
+    private final Instant timestamp;
 
-    public MigrationTaskAdditionalInformationsDTO(@JsonProperty("type") String type, @JsonProperty("targetVersion") int targetVersion) {
+    public MigrationTaskAdditionalInformationsDTO(@JsonProperty("type") String type,
+                                                  @JsonProperty("targetVersion") int targetVersion,
+                                                  @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.targetVersion = targetVersion;
+        this.timestamp = timestamp;
     }
 
     @Override
@@ -49,6 +55,10 @@ public class MigrationTaskAdditionalInformationsDTO implements AdditionalInforma
         return type;
     }
 
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
     public int getTargetVersion() {
         return targetVersion;
     }
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/migration/MigrationTaskSerializationTest.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/migration/MigrationTaskSerializationTest.java
index 2e61141..8ce6df7 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/migration/MigrationTaskSerializationTest.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/migration/MigrationTaskSerializationTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionDAO;
 import org.apache.james.backends.cassandra.versions.SchemaVersion;
@@ -36,7 +37,8 @@ class MigrationTaskSerializationTest {
 
     private static final int SCHEMA_VERSION = 12;
     private static final String SERIALIZED_TASK = "{\"type\": \"CassandraMigration\", \"targetVersion\": 12}";
-    private static final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"CassandraMigration\", \"targetVersion\": 12}";
+    private static final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"CassandraMigration\", \"targetVersion\": 12, \"timestamp\": \"2018-11-13T12:00:55Z\"}";
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
 
     private final CassandraSchemaVersionDAO cassandraSchemaVersionDAO = mock(CassandraSchemaVersionDAO.class);
     private final CassandraSchemaTransitions transitions = mock(CassandraSchemaTransitions.class);
@@ -59,13 +61,13 @@ class MigrationTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws JsonProcessingException {
-        MigrationTask.AdditionalInformations details = new MigrationTask.AdditionalInformations(new SchemaVersion(SCHEMA_VERSION));
+        MigrationTask.AdditionalInformations details = new MigrationTask.AdditionalInformations(new SchemaVersion(SCHEMA_VERSION), TIMESTAMP);
         assertThatJson(jsonAdditionalInformationSerializer.serialize(details)).isEqualTo(SERIALIZED_ADDITIONAL_INFORMATION);
     }
 
     @Test
     void additonalInformationShouldBeDeserializable() throws IOException {
-        MigrationTask.AdditionalInformations details = new MigrationTask.AdditionalInformations(new SchemaVersion(SCHEMA_VERSION));
+        MigrationTask.AdditionalInformations details = new MigrationTask.AdditionalInformations(new SchemaVersion(SCHEMA_VERSION), TIMESTAMP);
         assertThat(jsonAdditionalInformationSerializer.deserialize(SERIALIZED_ADDITIONAL_INFORMATION))
             .isEqualToComparingFieldByField(details);
     }
diff --git a/json/src/main/java/org/apache/james/json/JsonGenericSerializer.java b/json/src/main/java/org/apache/james/json/JsonGenericSerializer.java
index 5ace727..d3b70fd 100644
--- a/json/src/main/java/org/apache/james/json/JsonGenericSerializer.java
+++ b/json/src/main/java/org/apache/james/json/JsonGenericSerializer.java
@@ -30,6 +30,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.exc.MismatchedInputException;
 import com.fasterxml.jackson.datatype.guava.GuavaModule;
 import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
@@ -70,6 +71,7 @@ public class JsonGenericSerializer<T, U extends DTO> {
         objectMapper.registerModule(new JavaTimeModule());
         objectMapper.registerModule(new GuavaModule());
         objectMapper.setSerializationInclusion(JsonInclude.Include.NON_ABSENT);
+        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
         objectMapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
         typeToModule = modules.stream()
             .collect(Guavate.toImmutableMap(
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2Migration.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2Migration.java
index 7b46578..d127444 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2Migration.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2Migration.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.mailbox.cassandra.mail.migration;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 
 import javax.inject.Inject;
@@ -63,10 +65,12 @@ public class MailboxPathV2Migration implements Migration {
     public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
         private final long remainingCount;
         private final long initialCount;
+        private final Instant timestamp;
 
-        public AdditionalInformation(long remainingCount, long initialCount) {
+        public AdditionalInformation(long remainingCount, long initialCount, Instant timestamp) {
             this.remainingCount = remainingCount;
             this.initialCount = initialCount;
+            this.timestamp = timestamp;
         }
 
         public long getRemainingCount() {
@@ -76,6 +80,11 @@ public class MailboxPathV2Migration implements Migration {
         public long getInitialCount() {
             return initialCount;
         }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
     public static final Logger LOGGER = LoggerFactory.getLogger(MailboxPathV2Migration.class);
@@ -117,7 +126,7 @@ public class MailboxPathV2Migration implements Migration {
     }
 
     AdditionalInformation getAdditionalInformation() {
-        return new AdditionalInformation(getCurrentCount(), initialCount);
+        return new AdditionalInformation(getCurrentCount(), initialCount, Clock.systemUTC().instant());
     }
 
     private Long getCurrentCount() {
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTaskAdditionalInformationDTO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTaskAdditionalInformationDTO.java
index dbe9890..5c6c62e 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTaskAdditionalInformationDTO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTaskAdditionalInformationDTO.java
@@ -20,6 +20,8 @@
 
 package org.apache.james.mailbox.cassandra.mail.migration;
 
+import java.time.Instant;
+
 import org.apache.james.json.DTOModule;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
@@ -32,7 +34,8 @@ public class MailboxPathV2MigrationTaskAdditionalInformationDTO implements Addit
         return new MailboxPathV2MigrationTaskAdditionalInformationDTO(
             type,
             additionalInformation.getRemainingCount(),
-            additionalInformation.getInitialCount()
+            additionalInformation.getInitialCount(),
+            additionalInformation.timestamp()
         );
     }
 
@@ -48,13 +51,16 @@ public class MailboxPathV2MigrationTaskAdditionalInformationDTO implements Addit
     private final String type;
     private final long remainingCount;
     private final long initialCount;
+    private final Instant timestamp;
 
     public MailboxPathV2MigrationTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                               @JsonProperty("remainingCount") long remainingCount,
-                                                              @JsonProperty("initialCount") long initialCount) {
+                                                              @JsonProperty("initialCount") long initialCount,
+                                                              @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.remainingCount = remainingCount;
         this.initialCount = initialCount;
+        this.timestamp = timestamp;
     }
 
     public long getRemainingCount() {
@@ -66,6 +72,11 @@ public class MailboxPathV2MigrationTaskAdditionalInformationDTO implements Addit
     }
 
     @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    @Override
     public String getType() {
         return type;
     }
@@ -73,7 +84,8 @@ public class MailboxPathV2MigrationTaskAdditionalInformationDTO implements Addit
     private MailboxPathV2Migration.AdditionalInformation toDomainObject() {
         return new MailboxPathV2Migration.AdditionalInformation(
             remainingCount,
-            initialCount
+            initialCount,
+            timestamp
         );
     }
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTask.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTask.java
index 4a744c1..d11bd1c 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTask.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTask.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.mailbox.cassandra.mail.task;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -36,14 +38,16 @@ public class MailboxMergingTask implements Task {
         private final long totalMessageCount;
         private final long messageMovedCount;
         private final long messageFailedCount;
+        private final Instant timestamp;
 
 
-        public Details(CassandraId oldId, CassandraId newId, long totalMessageCount, long messageMovedCount, long messageFailedCount) {
+        public Details(CassandraId oldId, CassandraId newId, long totalMessageCount, long messageMovedCount, long messageFailedCount, Instant timestamp) {
             this.oldMailboxId = oldId;
             this.newMailboxId = newId;
             this.totalMessageCount = totalMessageCount;
             this.messageMovedCount = messageMovedCount;
             this.messageFailedCount = messageFailedCount;
+            this.timestamp = timestamp;
         }
 
         public String getOldMailboxId() {
@@ -65,6 +69,11 @@ public class MailboxMergingTask implements Task {
         public long getMessageFailedCount() {
             return messageFailedCount;
         }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
     public static class Context {
@@ -126,7 +135,8 @@ public class MailboxMergingTask implements Task {
         return Optional.of(new Details(oldMailboxId, newMailboxId,
             context.getTotalMessageCount(),
             context.getMessageMovedCount(),
-            context.getMessageFailedCount()));
+            context.getMessageFailedCount(),
+            Clock.systemUTC().instant()));
     }
 
     Context getContext() {
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskAdditionalInformationDTO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskAdditionalInformationDTO.java
index 3535627..df3dd79 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskAdditionalInformationDTO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskAdditionalInformationDTO.java
@@ -20,6 +20,8 @@
 
 package org.apache.james.mailbox.cassandra.mail.task;
 
+import java.time.Instant;
+
 import org.apache.james.json.DTOModule;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
@@ -37,7 +39,8 @@ public class MailboxMergingTaskAdditionalInformationDTO implements AdditionalInf
             details.getNewMailboxId(),
             details.getTotalMessageCount(),
             details.getMessageMovedCount(),
-            details.getMessageFailedCount()
+            details.getMessageFailedCount(),
+            details.timestamp()
         );
     }
 
@@ -55,19 +58,22 @@ public class MailboxMergingTaskAdditionalInformationDTO implements AdditionalInf
     private final long totalMessageCount;
     private final long messageMovedCount;
     private final long messageFailedCount;
+    private final Instant timestamp;
 
     public MailboxMergingTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                       @JsonProperty("oldMailboxId") String oldMailboxId,
                                                       @JsonProperty("newMailboxId") String newMailboxId,
                                                       @JsonProperty("totalMessageCount") long totalMessageCount,
                                                       @JsonProperty("messageMovedCount") long messageMovedCount,
-                                                      @JsonProperty("messageFailedCount") long messageFailedCount) {
+                                                      @JsonProperty("messageFailedCount") long messageFailedCount,
+                                                      @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.oldMailboxId = oldMailboxId;
         this.newMailboxId = newMailboxId;
         this.totalMessageCount = totalMessageCount;
         this.messageMovedCount = messageMovedCount;
         this.messageFailedCount = messageFailedCount;
+        this.timestamp = timestamp;
     }
 
     public String getOldMailboxId() {
@@ -95,13 +101,19 @@ public class MailboxMergingTaskAdditionalInformationDTO implements AdditionalInf
         return type;
     }
 
+    @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
     private MailboxMergingTask.Details toDomainObject() {
         return new MailboxMergingTask.Details(
             ID_FACTORY.fromString(oldMailboxId),
             ID_FACTORY.fromString(newMailboxId),
             totalMessageCount,
             messageMovedCount,
-            messageFailedCount
+            messageFailedCount,
+            timestamp
         );
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTaskSerializationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTaskSerializationTest.java
index f2a1b88..7ee513a 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTaskSerializationTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTaskSerializationTest.java
@@ -25,6 +25,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 
 import org.apache.james.server.task.json.JsonTaskAdditionalInformationsSerializer;
 import org.apache.james.server.task.json.JsonTaskSerializer;
@@ -34,11 +35,12 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import org.junit.jupiter.api.Test;
 
 class MailboxPathV2MigrationTaskSerializationTest {
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
     private static final MailboxPathV2Migration MIGRATION = mock(MailboxPathV2Migration.class);
     private static final MailboxPathV2Migration.MailboxPathV2MigrationTask TASK = new MailboxPathV2Migration.MailboxPathV2MigrationTask(MIGRATION);
     private static final String SERIALIZED_TASK = "{\"type\": \"Cassandra_mailboxPathV2Migration\"}";
-    private static final MailboxPathV2Migration.AdditionalInformation DETAILS = new MailboxPathV2Migration.AdditionalInformation(42L, 10);
-    private static final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"Cassandra_mailboxPathV2Migration\", \"remainingCount\":42,\"initialCount\":10}";
+    private static final MailboxPathV2Migration.AdditionalInformation DETAILS = new MailboxPathV2Migration.AdditionalInformation(42L, 10, TIMESTAMP);
+    private static final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"Cassandra_mailboxPathV2Migration\", \"remainingCount\":42,\"initialCount\":10, \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     private static final JsonTaskSerializer TASK_SERIALIZER = new JsonTaskSerializer(MailboxPathV2MigrationTaskDTO.MODULE.apply(MIGRATION));
     private static final JsonTaskAdditionalInformationsSerializer JSON_TASK_ADDITIONAL_INFORMATIONS_SERIALIZER = new JsonTaskAdditionalInformationsSerializer(MailboxPathV2MigrationTaskAdditionalInformationDTO.MODULE);
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskTest.java
index fe175c2..575509c 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/MailboxMergingTaskTest.java
@@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.server.task.json.JsonTaskAdditionalInformationsSerializer;
@@ -34,12 +35,13 @@ import net.javacrumbs.jsonunit.assertj.JsonAssertions;
 import org.junit.jupiter.api.Test;
 
 class MailboxMergingTaskTest {
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
     private static final CassandraId.Factory CASSANDRA_ID_FACTORY = new CassandraId.Factory();
     private static final String SERIALIZED = "{\"type\":\"mailboxMerging\",\"totalMessageCount\":0,\"oldMailboxId\":\"3b8e5f90-b94f-20f8-ce7b-3c4aad93b90c\",\"newMailboxId\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\"}";
-    private static final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\":\"mailboxMerging\", \"oldMailboxId\":\"3b8e5f90-b94f-20f8-ce7b-3c4aad93b90c\",\"newMailboxId\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"totalMessageCount\":10,\"messageMovedCount\":15,\"messageFailedCount\":20}";
+    private static final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\":\"mailboxMerging\", \"oldMailboxId\":\"3b8e5f90-b94f-20f8-ce7b-3c4aad93b90c\",\"newMailboxId\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"totalMessageCount\":10,\"messageMovedCount\":15,\"messageFailedCount\":20, \"timestamp\":\"2018-11-13T12:00:55Z\"}";
     private static final MailboxMergingTaskRunner TASK_RUNNER = mock(MailboxMergingTaskRunner.class);
     private static final MailboxMergingTask TASK = new MailboxMergingTask(TASK_RUNNER, 0L, CASSANDRA_ID_FACTORY.fromString("3b8e5f90-b94f-20f8-ce7b-3c4aad93b90c"), CASSANDRA_ID_FACTORY.fromString("2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd"));
-    private static final MailboxMergingTask.Details DETAILS = new MailboxMergingTask.Details(CASSANDRA_ID_FACTORY.fromString("3b8e5f90-b94f-20f8-ce7b-3c4aad93b90c"), CASSANDRA_ID_FACTORY.fromString("2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd"), 10, 15, 20);
+    private static final MailboxMergingTask.Details DETAILS = new MailboxMergingTask.Details(CASSANDRA_ID_FACTORY.fromString("3b8e5f90-b94f-20f8-ce7b-3c4aad93b90c"), CASSANDRA_ID_FACTORY.fromString("2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd"), 10, 15, 20, TIMESTAMP);
     private static final JsonTaskAdditionalInformationsSerializer JSON_TASK_ADDITIONAL_INFORMATIONS_SERIALIZER = new JsonTaskAdditionalInformationsSerializer(MailboxMergingTaskAdditionalInformationDTO.SERIALIZATION_MODULE);
     private static final JsonTaskSerializer TESTEE = new JsonTaskSerializer(MailboxMergingTaskDTO.module(TASK_RUNNER));
 
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTask.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTask.java
index 827658d..db85116 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTask.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTask.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.vault.blob;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.time.ZonedDateTime;
 import java.util.Collection;
 import java.util.List;
@@ -42,10 +44,12 @@ public class BlobStoreVaultGarbageCollectionTask implements Task {
 
         private final ZonedDateTime beginningOfRetentionPeriod;
         private final Collection<BucketName> deletedBuckets;
+        private final Instant timestamp;
 
-        AdditionalInformation(ZonedDateTime beginningOfRetentionPeriod, Collection<BucketName> deletedBuckets) {
+        AdditionalInformation(ZonedDateTime beginningOfRetentionPeriod, Collection<BucketName> deletedBuckets, Instant timestamp) {
             this.beginningOfRetentionPeriod = beginningOfRetentionPeriod;
             this.deletedBuckets = deletedBuckets;
+            this.timestamp = timestamp;
         }
 
         public ZonedDateTime getBeginningOfRetentionPeriod() {
@@ -57,6 +61,11 @@ public class BlobStoreVaultGarbageCollectionTask implements Task {
                 .map(BucketName::asString)
                 .collect(Guavate.toImmutableList());
         }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
     static final TaskType TYPE = TaskType.of("deletedMessages/blobStoreBasedGarbageCollection");
@@ -102,7 +111,7 @@ public class BlobStoreVaultGarbageCollectionTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(new AdditionalInformation(beginningOfRetentionPeriod, deletedBuckets));
+        return Optional.of(new AdditionalInformation(beginningOfRetentionPeriod, deletedBuckets, Clock.systemUTC().instant()));
     }
 
     ZonedDateTime getBeginningOfRetentionPeriod() {
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.java
index 87d236c..fff7526 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.java
@@ -20,6 +20,7 @@
 
 package org.apache.james.vault.blob;
 
+import java.time.Instant;
 import java.time.ZonedDateTime;
 import java.util.Collection;
 
@@ -36,7 +37,8 @@ public class BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO impleme
         return new BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO(
             type,
             additionalInformation.getBeginningOfRetentionPeriod().toString(),
-            additionalInformation.getDeletedBuckets()
+            additionalInformation.getDeletedBuckets(),
+            additionalInformation.timestamp()
         );
     }
 
@@ -52,14 +54,17 @@ public class BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO impleme
     private final String beginningOfRetentionPeriod;
     private final Collection<String> deletedBuckets;
     private final String type;
+    private final Instant timestamp;
 
     BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO(
         @JsonProperty("type") String type,
         @JsonProperty("beginningOfRetentionPeriod") String beginningOfRetentionPeriod,
-        @JsonProperty("deletedBuckets") Collection<String> deletedBuckets) {
+        @JsonProperty("deletedBuckets") Collection<String> deletedBuckets,
+        @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.beginningOfRetentionPeriod = beginningOfRetentionPeriod;
         this.deletedBuckets = deletedBuckets;
+        this.timestamp = timestamp;
     }
 
     BlobStoreVaultGarbageCollectionTask.AdditionalInformation toDomainObject() {
@@ -68,7 +73,8 @@ public class BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO impleme
             deletedBuckets
                 .stream()
                 .map(BucketName::of)
-                .collect(Guavate.toImmutableList()));
+                .collect(Guavate.toImmutableList()),
+            timestamp);
     }
 
     public String getBeginningOfRetentionPeriod() {
@@ -83,4 +89,9 @@ public class BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO impleme
     public String getType() {
         return type;
     }
+
+    @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
 }
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskSerializationTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskSerializationTest.java
index 6c2a0b2..f49e7f5 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskSerializationTest.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreVaultGarbageCollectionTaskSerializationTest.java
@@ -25,6 +25,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 
 import java.io.IOException;
+import java.time.Instant;
 import java.time.ZonedDateTime;
 
 import org.apache.james.blob.api.BucketName;
@@ -49,11 +50,12 @@ class BlobStoreVaultGarbageCollectionTaskSerializationTest {
     private static final ZonedDateTime BEGINNING_OF_RETENTION_PERIOD = ZonedDateTime.parse("2019-09-03T15:26:13.356+02:00[Europe/Paris]");
     private static final ImmutableList<BucketName> BUCKET_IDS = ImmutableList.of(BucketName.of("1"), BucketName.of("2"), BucketName.of("3"));
     private static final Flux<BucketName> RETENTION_OPERATION = Flux.fromIterable(BUCKET_IDS);
-    private static final BlobStoreVaultGarbageCollectionTask.AdditionalInformation DETAILS = new BlobStoreVaultGarbageCollectionTask.AdditionalInformation(BEGINNING_OF_RETENTION_PERIOD, BUCKET_IDS);
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+    private static final BlobStoreVaultGarbageCollectionTask.AdditionalInformation DETAILS = new BlobStoreVaultGarbageCollectionTask.AdditionalInformation(BEGINNING_OF_RETENTION_PERIOD, BUCKET_IDS, TIMESTAMP);
     private static final BlobStoreVaultGarbageCollectionTask TASK = TASK_FACTORY.create();
 
     private static final String SERIALIZED_TASK = "{\"type\":\"deletedMessages/blobStoreBasedGarbageCollection\"}";
-    private static final String SERIALIZED_ADDITIONAL_INFORMATION_TASK = "{\"type\":\"deletedMessages/blobStoreBasedGarbageCollection\", \"beginningOfRetentionPeriod\":\"2019-09-03T15:26:13.356+02:00[Europe/Paris]\",\"deletedBuckets\":[\"1\", \"2\", \"3\"]}";
+    private static final String SERIALIZED_ADDITIONAL_INFORMATION_TASK = "{\"type\":\"deletedMessages/blobStoreBasedGarbageCollection\", \"beginningOfRetentionPeriod\":\"2019-09-03T15:26:13.356+02:00[Europe/Paris]\",\"deletedBuckets\":[\"1\", \"2\", \"3\"], \"timestamp\": \"2018-11-13T12:00:55Z\"}";
 
     private static final JsonTaskAdditionalInformationsSerializer JSON_TASK_ADDITIONAL_INFORMATIONS_SERIALIZER = new JsonTaskAdditionalInformationsSerializer(BlobStoreVaultGarbageCollectionTaskAdditionalInformationDTO.MODULE);
 
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexingTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexingTask.java
index 74fc454..6cbba51 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexingTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReIndexingTask.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.mailbox.tools.indexer;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 
 import javax.inject.Inject;
@@ -52,14 +54,21 @@ public class MessageIdReIndexingTask implements Task {
 
     public static final class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
         private final MessageId messageId;
+        private final Instant timestamp;
 
-        AdditionalInformation(MessageId messageId) {
+        AdditionalInformation(MessageId messageId, Instant timestamp) {
             this.messageId = messageId;
+            this.timestamp = timestamp;
         }
 
         public String getMessageId() {
             return messageId.serialize();
         }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
 
@@ -70,7 +79,7 @@ public class MessageIdReIndexingTask implements Task {
     MessageIdReIndexingTask(ReIndexerPerformer reIndexerPerformer, MessageId messageId) {
         this.reIndexerPerformer = reIndexerPerformer;
         this.messageId = messageId;
-        this.additionalInformation = new AdditionalInformation(messageId);
+        this.additionalInformation = new AdditionalInformation(messageId, Clock.systemUTC().instant());
     }
 
     @Override
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskAdditionalInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskAdditionalInformationDTO.java
index f2235c6..b417db8 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskAdditionalInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskAdditionalInformationDTO.java
@@ -18,6 +18,9 @@
  ****************************************************************/
 package org.apache.mailbox.tools.indexer;
 
+import java.time.Clock;
+import java.time.Instant;
+
 import org.apache.james.json.DTOModule;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
@@ -30,30 +33,41 @@ public class MessageIdReindexingTaskAdditionalInformationDTO implements Addition
     public static AdditionalInformationDTOModule<MessageIdReIndexingTask.AdditionalInformation, MessageIdReindexingTaskAdditionalInformationDTO> serializationModule(MessageId.Factory factory) {
         return DTOModule.forDomainObject(MessageIdReIndexingTask.AdditionalInformation.class)
             .convertToDTO(MessageIdReindexingTaskAdditionalInformationDTO.class)
-            .toDomainObjectConverter(dto -> new MessageIdReIndexingTask.AdditionalInformation(factory.fromString(dto.getMessageId())))
-            .toDTOConverter((details, type) -> new MessageIdReindexingTaskAdditionalInformationDTO(type, details.getMessageId()))
+            .toDomainObjectConverter(dto -> new MessageIdReIndexingTask.AdditionalInformation(factory.fromString(dto.getMessageId()), dto.timestamp))
+            .toDTOConverter((details, type) -> new MessageIdReindexingTaskAdditionalInformationDTO(type, details.getMessageId(), details.timestamp()))
             .typeName(MessageIdReIndexingTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
     }
 
     private final String type;
     private final String messageId;
+    private final Instant timestamp;
 
-    private MessageIdReindexingTaskAdditionalInformationDTO(@JsonProperty("type") String type, @JsonProperty("messageId") String messageId) {
+    private MessageIdReindexingTaskAdditionalInformationDTO(@JsonProperty("type") String type,
+                                                            @JsonProperty("messageId") String messageId,
+                                                            @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.messageId = messageId;
+        this.timestamp = timestamp;
     }
 
     public String getMessageId() {
         return messageId;
     }
 
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
     @Override
     public String getType() {
         return type;
     }
 
     public static MessageIdReindexingTaskAdditionalInformationDTO of(MessageIdReIndexingTask task) {
-        return new MessageIdReindexingTaskAdditionalInformationDTO(task.type().asString(), task.getMessageId().serialize());
+        return new MessageIdReindexingTaskAdditionalInformationDTO(
+            task.type().asString(),
+            task.getMessageId().serialize(),
+            Clock.systemUTC().instant());
     }
 }
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformation.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformation.java
index 31c6839..2b6e656 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformation.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformation.java
@@ -19,6 +19,9 @@
 
 package org.apache.mailbox.tools.indexer;
 
+import java.time.Clock;
+import java.time.Instant;
+
 import org.apache.james.mailbox.indexer.IndexingDetailInformation;
 import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
 import org.apache.james.task.TaskExecutionDetails;
@@ -31,21 +34,32 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 public class ReprocessingContextInformation implements TaskExecutionDetails.AdditionalInformation, IndexingDetailInformation {
 
     public static ReprocessingContextInformationForErrorRecoveryIndexationTask forErrorRecoveryIndexationTask(ReprocessingContext reprocessingContext) {
-        return new ReprocessingContextInformationForErrorRecoveryIndexationTask(reprocessingContext.successfullyReprocessedMailCount(), reprocessingContext.failedReprocessingMailCount(), reprocessingContext.failures());
+        return new ReprocessingContextInformationForErrorRecoveryIndexationTask(
+            reprocessingContext.successfullyReprocessedMailCount(),
+            reprocessingContext.failedReprocessingMailCount(),
+            reprocessingContext.failures(),
+            Clock.systemUTC().instant());
     }
 
     public static ReprocessingContextInformationForFullReindexingTask forFullReindexingTask(ReprocessingContext reprocessingContext) {
-        return new ReprocessingContextInformationForFullReindexingTask(reprocessingContext.successfullyReprocessedMailCount(), reprocessingContext.failedReprocessingMailCount(), reprocessingContext.failures());
+        return new ReprocessingContextInformationForFullReindexingTask(
+            reprocessingContext.successfullyReprocessedMailCount(),
+            reprocessingContext.failedReprocessingMailCount(),
+            reprocessingContext.failures(),
+            Clock.systemUTC().instant());
     }
 
     private final int successfullyReprocessedMailCount;
     private final int failedReprocessedMailCount;
     private final ReIndexingExecutionFailures failures;
+    private final Instant timestamp;
 
-    ReprocessingContextInformation(int successfullyReprocessedMailCount, int failedReprocessedMailCount, ReIndexingExecutionFailures failures) {
+    ReprocessingContextInformation(int successfullyReprocessedMailCount, int failedReprocessedMailCount,
+                                   ReIndexingExecutionFailures failures, Instant timestamp) {
         this.successfullyReprocessedMailCount = successfullyReprocessedMailCount;
         this.failedReprocessedMailCount = failedReprocessedMailCount;
         this.failures = failures;
+        this.timestamp = timestamp;
     }
 
     @Override
@@ -68,4 +82,9 @@ public class ReprocessingContextInformation implements TaskExecutionDetails.Addi
     public SerializableReIndexingExecutionFailures failuresAsJson() {
         return SerializableReIndexingExecutionFailures.from(failures());
     }
+
+    @Override
+    public Instant timestamp() {
+        return timestamp;
+    }
 }
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformationDTO.java
index f7722d8..3ee9c7f 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReprocessingContextInformationDTO.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.mailbox.tools.indexer;
 
+import java.time.Instant;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -60,14 +61,23 @@ public class ReprocessingContextInformationDTO implements AdditionalInformationD
         public static final AdditionalInformationDTOModule<ReprocessingContextInformationForErrorRecoveryIndexationTask, ReprocessingContextInformationDTO> serializationModule(MailboxId.Factory mailboxIdFactory) {
             return DTOModule.forDomainObject(ReprocessingContextInformationForErrorRecoveryIndexationTask.class)
                 .convertToDTO(ReprocessingContextInformationDTO.class)
-                .toDomainObjectConverter(dto -> new ReprocessingContextInformationForErrorRecoveryIndexationTask(dto.successfullyReprocessedMailCount, dto.failedReprocessedMailCount, deserializeFailures(mailboxIdFactory, dto.failures)))
-                .toDTOConverter((details, type) -> new ReprocessingContextInformationDTO(type, details.getSuccessfullyReprocessedMailCount(), details.getFailedReprocessedMailCount(), serializeFailures(details.failures())))
+                .toDomainObjectConverter(dto -> new ReprocessingContextInformationForErrorRecoveryIndexationTask(
+                    dto.successfullyReprocessedMailCount,
+                    dto.failedReprocessedMailCount,
+                    deserializeFailures(mailboxIdFactory, dto.failures),
+                    dto.getTimestamp()))
+                .toDTOConverter((details, type) -> new ReprocessingContextInformationDTO(
+                    type,
+                    details.getSuccessfullyReprocessedMailCount(),
+                    details.getFailedReprocessedMailCount(),
+                    serializeFailures(details.failures()),
+                    details.timestamp()))
                 .typeName(ErrorRecoveryIndexationTask.PREVIOUS_FAILURES_INDEXING.asString())
                 .withFactory(AdditionalInformationDTOModule::new);
         }
 
-        ReprocessingContextInformationForErrorRecoveryIndexationTask(int successfullyReprocessedMailCount, int failedReprocessedMailCount, ReIndexingExecutionFailures failures) {
-            super(successfullyReprocessedMailCount, failedReprocessedMailCount, failures);
+        ReprocessingContextInformationForErrorRecoveryIndexationTask(int successfullyReprocessedMailCount, int failedReprocessedMailCount, ReIndexingExecutionFailures failures, Instant timestamp) {
+            super(successfullyReprocessedMailCount, failedReprocessedMailCount, failures, timestamp);
         }
     }
 
@@ -75,14 +85,19 @@ public class ReprocessingContextInformationDTO implements AdditionalInformationD
         public static final AdditionalInformationDTOModule<ReprocessingContextInformationForFullReindexingTask, ReprocessingContextInformationDTO> serializationModule(MailboxId.Factory mailboxIdFactory) {
             return DTOModule.forDomainObject(ReprocessingContextInformationForFullReindexingTask.class)
                 .convertToDTO(ReprocessingContextInformationDTO.class)
-                .toDomainObjectConverter(dto -> new ReprocessingContextInformationForFullReindexingTask(dto.successfullyReprocessedMailCount, dto.failedReprocessedMailCount, deserializeFailures(mailboxIdFactory, dto.failures)))
-                .toDTOConverter((details, type) -> new ReprocessingContextInformationDTO(type, details.getSuccessfullyReprocessedMailCount(), details.getFailedReprocessedMailCount(), serializeFailures(details.failures())))
+                .toDomainObjectConverter(dto -> new ReprocessingContextInformationForFullReindexingTask(dto.successfullyReprocessedMailCount, dto.failedReprocessedMailCount, deserializeFailures(mailboxIdFactory, dto.failures), dto.getTimestamp()))
+                .toDTOConverter((details, type) -> new ReprocessingContextInformationDTO(
+                    type,
+                    details.getSuccessfullyReprocessedMailCount(),
+                    details.getFailedReprocessedMailCount(),
+                    serializeFailures(details.failures()),
+                    details.timestamp()))
                 .typeName(FullReindexingTask.FULL_RE_INDEXING.asString())
                 .withFactory(AdditionalInformationDTOModule::new);
         }
 
-        ReprocessingContextInformationForFullReindexingTask(int successfullyReprocessedMailCount, int failedReprocessedMailCount, ReIndexingExecutionFailures failures) {
-            super(successfullyReprocessedMailCount, failedReprocessedMailCount, failures);
+        ReprocessingContextInformationForFullReindexingTask(int successfullyReprocessedMailCount, int failedReprocessedMailCount, ReIndexingExecutionFailures failures, Instant timestamp) {
+            super(successfullyReprocessedMailCount, failedReprocessedMailCount, failures, timestamp);
         }
     }
 
@@ -133,16 +148,19 @@ public class ReprocessingContextInformationDTO implements AdditionalInformationD
     private final int successfullyReprocessedMailCount;
     private final int failedReprocessedMailCount;
     private final List<ReindexingFailureDTO> failures;
+    private final Instant timestamp;
 
 
     ReprocessingContextInformationDTO(@JsonProperty("type") String type,
                                       @JsonProperty("successfullyReprocessedMailCount") int successfullyReprocessedMailCount,
                                       @JsonProperty("failedReprocessedMailCount") int failedReprocessedMailCount,
-                                      @JsonProperty("failures") List<ReindexingFailureDTO> failures) {
+                                      @JsonProperty("failures") List<ReindexingFailureDTO> failures,
+                                      @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.successfullyReprocessedMailCount = successfullyReprocessedMailCount;
         this.failedReprocessedMailCount = failedReprocessedMailCount;
         this.failures = failures;
+        this.timestamp = timestamp;
     }
 
     public int getSuccessfullyReprocessedMailCount() {
@@ -157,6 +175,10 @@ public class ReprocessingContextInformationDTO implements AdditionalInformationD
         return failures;
     }
 
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
     @Override
     public String getType() {
         return type;
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java
index b29f000..a9e3a16 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTask.java
@@ -19,6 +19,8 @@
 
 package org.apache.mailbox.tools.indexer;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 
 import javax.inject.Inject;
@@ -36,8 +38,8 @@ public class SingleMailboxReindexingTask implements Task {
     public static class AdditionalInformation extends ReprocessingContextInformation {
         private final MailboxId mailboxId;
 
-        AdditionalInformation(MailboxId mailboxId, int successfullyReprocessedMailCount, int failedReprocessedMailCount, ReIndexingExecutionFailures failures) {
-            super(successfullyReprocessedMailCount, failedReprocessedMailCount, failures);
+        AdditionalInformation(MailboxId mailboxId, int successfullyReprocessedMailCount, int failedReprocessedMailCount, ReIndexingExecutionFailures failures, Instant timestamp) {
+            super(successfullyReprocessedMailCount, failedReprocessedMailCount, failures, timestamp);
             this.mailboxId = mailboxId;
         }
 
@@ -99,7 +101,8 @@ public class SingleMailboxReindexingTask implements Task {
                 mailboxId,
                 reprocessingContext.successfullyReprocessedMailCount(),
                 reprocessingContext.failedReprocessingMailCount(),
-                reprocessingContext.failures())
+                reprocessingContext.failures(),
+                Clock.systemUTC().instant())
         );
     }
 
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskAdditionalInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskAdditionalInformationDTO.java
index 8fb0733..7ac4084 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskAdditionalInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskAdditionalInformationDTO.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.mailbox.tools.indexer;
 
+import java.time.Instant;
 import java.util.List;
 
 import org.apache.james.json.DTOModule;
@@ -36,9 +37,15 @@ public class SingleMailboxReindexingTaskAdditionalInformationDTO implements Addi
             .toDomainObjectConverter(dto -> new SingleMailboxReindexingTask.AdditionalInformation(factory.fromString(dto.getMailboxId()),
                 dto.getSuccessfullyReprocessedMailCount(),
                 dto.getFailedReprocessedMailCount(),
-                ReprocessingContextInformationDTO.deserializeFailures(factory, dto.getFailures())))
-            .toDTOConverter((details, type) -> new SingleMailboxReindexingTaskAdditionalInformationDTO(type, details.getMailboxId(), details.getSuccessfullyReprocessedMailCount(), details.getFailedReprocessedMailCount(),
-                ReprocessingContextInformationDTO.serializeFailures(details.failures())))
+                ReprocessingContextInformationDTO.deserializeFailures(factory, dto.getFailures()),
+                dto.getTimestamp()))
+            .toDTOConverter((details, type) -> new SingleMailboxReindexingTaskAdditionalInformationDTO(
+                type,
+                details.getMailboxId(),
+                details.getSuccessfullyReprocessedMailCount(),
+                details.getFailedReprocessedMailCount(),
+                ReprocessingContextInformationDTO.serializeFailures(details.failures()),
+                details.timestamp()))
             .typeName(SingleMailboxReindexingTask.MAILBOX_RE_INDEXING.asString())
             .withFactory(AdditionalInformationDTOModule::new);
     }
@@ -51,12 +58,14 @@ public class SingleMailboxReindexingTaskAdditionalInformationDTO implements Addi
                                                                 @JsonProperty("mailboxId") String mailboxId,
                                                                 @JsonProperty("successfullyReprocessedMailCount") int successfullyReprocessedMailCount,
                                                                 @JsonProperty("failedReprocessedMailCount") int failedReprocessedMailCount,
-                                                                @JsonProperty("failures") List<ReprocessingContextInformationDTO.ReindexingFailureDTO> failures) {
+                                                                @JsonProperty("failures") List<ReprocessingContextInformationDTO.ReindexingFailureDTO> failures,
+                                                                @JsonProperty("timestamp") Instant timestamp) {
         this.mailboxId = mailboxId;
         this.reprocessingContextInformationDTO = new ReprocessingContextInformationDTO(
             type,
             successfullyReprocessedMailCount,
-            failedReprocessedMailCount, failures);
+            failedReprocessedMailCount, failures,
+            timestamp);
     }
 
     @Override
@@ -64,6 +73,10 @@ public class SingleMailboxReindexingTaskAdditionalInformationDTO implements Addi
         return reprocessingContextInformationDTO.getType();
     }
 
+    public Instant getTimestamp() {
+        return reprocessingContextInformationDTO.getTimestamp();
+    }
+
     public String getMailboxId() {
         return mailboxId;
     }
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTask.java
index 57d45ec..a5d3a52 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTask.java
@@ -19,6 +19,8 @@
 
 package org.apache.mailbox.tools.indexer;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 
 import javax.inject.Inject;
@@ -40,10 +42,12 @@ public class SingleMessageReindexingTask implements Task {
     public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
         private final MailboxId mailboxId;
         private final MessageUid uid;
+        private final Instant timestamp;
 
-        AdditionalInformation(MailboxId mailboxId, MessageUid uid) {
+        AdditionalInformation(MailboxId mailboxId, MessageUid uid, Instant timestamp) {
             this.mailboxId = mailboxId;
             this.uid = uid;
+            this.timestamp = timestamp;
         }
 
         public String getMailboxId() {
@@ -53,6 +57,11 @@ public class SingleMessageReindexingTask implements Task {
         public long getUid() {
             return uid.asLong();
         }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
     public static class Factory {
@@ -83,7 +92,7 @@ public class SingleMessageReindexingTask implements Task {
         this.reIndexerPerformer = reIndexerPerformer;
         this.mailboxId = mailboxId;
         this.uid = uid;
-        this.additionalInformation = new AdditionalInformation(mailboxId, uid);
+        this.additionalInformation = new AdditionalInformation(mailboxId, uid, Clock.systemUTC().instant());
     }
 
     @Override
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskAdditionalInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskAdditionalInformationDTO.java
index c42d843..c783c63 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskAdditionalInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskAdditionalInformationDTO.java
@@ -18,6 +18,9 @@
  ****************************************************************/
 package org.apache.mailbox.tools.indexer;
 
+import java.time.Clock;
+import java.time.Instant;
+
 import org.apache.james.json.DTOModule;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.MailboxId;
@@ -31,8 +34,15 @@ public class SingleMessageReindexingTaskAdditionalInformationDTO implements Addi
     public static AdditionalInformationDTOModule<SingleMessageReindexingTask.AdditionalInformation, SingleMessageReindexingTaskAdditionalInformationDTO> serializationModule(MailboxId.Factory factory) {
         return DTOModule.forDomainObject(SingleMessageReindexingTask.AdditionalInformation.class)
             .convertToDTO(SingleMessageReindexingTaskAdditionalInformationDTO.class)
-            .toDomainObjectConverter(dto -> new SingleMessageReindexingTask.AdditionalInformation(factory.fromString(dto.mailboxId), MessageUid.of(dto.getUid())))
-            .toDTOConverter((details, type) -> new SingleMessageReindexingTaskAdditionalInformationDTO(type, details.getMailboxId(), details.getUid()))
+            .toDomainObjectConverter(dto -> new SingleMessageReindexingTask.AdditionalInformation(
+                factory.fromString(dto.mailboxId),
+                MessageUid.of(dto.getUid()),
+                dto.timestamp))
+            .toDTOConverter((details, type) -> new SingleMessageReindexingTaskAdditionalInformationDTO(
+                type,
+                details.getMailboxId(),
+                details.getUid(),
+                details.timestamp()))
             .typeName(SingleMessageReindexingTask.MESSAGE_RE_INDEXING.asString())
             .withFactory(AdditionalInformationDTOModule::new);
     }
@@ -40,13 +50,16 @@ public class SingleMessageReindexingTaskAdditionalInformationDTO implements Addi
     private final String type;
     private final String mailboxId;
     private final long uid;
+    private final Instant timestamp;
 
     private SingleMessageReindexingTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                                 @JsonProperty("mailboxId") String mailboxId,
-                                                                @JsonProperty("uid") long uid) {
+                                                                @JsonProperty("uid") long uid,
+                                                                @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.mailboxId = mailboxId;
         this.uid = uid;
+        this.timestamp = timestamp;
     }
 
     public String getMailboxId() {
@@ -62,7 +75,11 @@ public class SingleMessageReindexingTaskAdditionalInformationDTO implements Addi
         return type;
     }
 
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
     public static SingleMessageReindexingTaskAdditionalInformationDTO of(SingleMessageReindexingTask task) {
-        return new SingleMessageReindexingTaskAdditionalInformationDTO(task.type().asString(), task.getMailboxId().serialize(), task.getUid().asLong());
+        return new SingleMessageReindexingTaskAdditionalInformationDTO(task.type().asString(), task.getMailboxId().serialize(), task.getUid().asLong(), Clock.systemUTC().instant());
     }
 }
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
index 7b69928..2be1147 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java
@@ -19,6 +19,8 @@
 
 package org.apache.mailbox.tools.indexer;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 
 import javax.inject.Inject;
@@ -37,8 +39,8 @@ public class UserReindexingTask implements Task {
     public static class AdditionalInformation extends ReprocessingContextInformation {
         private final User user;
 
-        AdditionalInformation(User user, int successfullyReprocessedMailCount, int failedReprocessedMailCount, ReIndexingExecutionFailures failures) {
-            super(successfullyReprocessedMailCount, failedReprocessedMailCount, failures);
+        AdditionalInformation(User user, int successfullyReprocessedMailCount, int failedReprocessedMailCount, ReIndexingExecutionFailures failures, Instant timestamp) {
+            super(successfullyReprocessedMailCount, failedReprocessedMailCount, failures, timestamp);
             this.user = user;
         }
 
@@ -97,7 +99,8 @@ public class UserReindexingTask implements Task {
         return Optional.of(new UserReindexingTask.AdditionalInformation(user,
             reprocessingContext.successfullyReprocessedMailCount(),
             reprocessingContext.failedReprocessingMailCount(),
-            reprocessingContext.failures())
+            reprocessingContext.failures(),
+            Clock.systemUTC().instant())
         );
     }
 }
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
index 87e2b4e..38aa0ee 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTaskAdditionalInformationDTO.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.mailbox.tools.indexer;
 
+import java.time.Instant;
 import java.util.List;
 
 import org.apache.james.core.User;
@@ -37,9 +38,15 @@ public class UserReindexingTaskAdditionalInformationDTO implements AdditionalInf
             .toDomainObjectConverter(dto -> new UserReindexingTask.AdditionalInformation(User.fromUsername(dto.getUser()),
                 dto.getSuccessfullyReprocessedMailCount(),
                 dto.getFailedReprocessedMailCount(),
-                ReprocessingContextInformationDTO.deserializeFailures(factory, dto.getFailures())))
-            .toDTOConverter((details, type) -> new UserReindexingTaskAdditionalInformationDTO(type, details.getUser(), details.getSuccessfullyReprocessedMailCount(), details.getFailedReprocessedMailCount(),
-                ReprocessingContextInformationDTO.serializeFailures(details.failures())))
+                ReprocessingContextInformationDTO.deserializeFailures(factory, dto.getFailures()),
+                dto.getTimestamp()))
+            .toDTOConverter((details, type) -> new UserReindexingTaskAdditionalInformationDTO(
+                type,
+                details.getUser(),
+                details.getSuccessfullyReprocessedMailCount(),
+                details.getFailedReprocessedMailCount(),
+                ReprocessingContextInformationDTO.serializeFailures(details.failures()),
+                details.timestamp()))
             .typeName(UserReindexingTask.USER_RE_INDEXING.asString())
             .withFactory(AdditionalInformationDTOModule::new);
     }
@@ -52,12 +59,13 @@ public class UserReindexingTaskAdditionalInformationDTO implements AdditionalInf
                                                        @JsonProperty("user") String user,
                                                        @JsonProperty("successfullyReprocessedMailCount") int successfullyReprocessedMailCount,
                                                        @JsonProperty("failedReprocessedMailCount") int failedReprocessedMailCount,
-                                                       @JsonProperty("failures") List<ReprocessingContextInformationDTO.ReindexingFailureDTO> failures) {
+                                                       @JsonProperty("failures") List<ReprocessingContextInformationDTO.ReindexingFailureDTO> failures,
+                                                       @JsonProperty("timestamp") Instant timestamp) {
         this.user = user;
         this.reprocessingContextInformationDTO = new ReprocessingContextInformationDTO(
             type,
             successfullyReprocessedMailCount,
-            failedReprocessedMailCount, failures);
+            failedReprocessedMailCount, failures, timestamp);
     }
 
     @Override
@@ -65,6 +73,10 @@ public class UserReindexingTaskAdditionalInformationDTO implements AdditionalInf
         return reprocessingContextInformationDTO.getType();
     }
 
+    public Instant getTimestamp() {
+        return reprocessingContextInformationDTO.getTimestamp();
+    }
+
     public String getUser() {
         return user;
     }
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTaskSerializationTest.java
index 18c18a3..fa463a8 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ErrorRecoveryIndexationTaskSerializationTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 import java.util.List;
 
 import org.apache.james.mailbox.MessageUid;
@@ -41,6 +42,7 @@ import com.google.common.collect.ImmutableList;
 
 class ErrorRecoveryIndexationTaskSerializationTest {
 
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
     private final TestId.Factory mailboxIdFactory = new TestId.Factory();
     private ReIndexerPerformer reIndexerPerformer;
     private JsonTaskSerializer taskSerializer;
@@ -52,7 +54,7 @@ class ErrorRecoveryIndexationTaskSerializationTest {
 
     private final String serializedErrorRecoveryReindexingTask = "{\"type\": \"ErrorRecoveryIndexation\"," +
         " \"previousFailures\" : [{\"mailboxId\":\"1\",\"uids\":[10]},{\"mailboxId\":\"2\",\"uids\":[20]}]}";
-    private final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"ErrorRecoveryIndexation\", \"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":[{\"mailboxId\":\"1\",\"uids\":[10]},{\"mailboxId\":\"2\",\"uids\":[20]}]}";
+    private final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"ErrorRecoveryIndexation\", \"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":[{\"mailboxId\":\"1\",\"uids\":[10]},{\"mailboxId\":\"2\",\"uids\":[20]}], \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     private final TestId mailboxId = TestId.of(1L);
     private final MessageUid messageUid = MessageUid.of(10L);
@@ -99,13 +101,13 @@ class ErrorRecoveryIndexationTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws JsonProcessingException {
-        ReprocessingContextInformation details = new ReprocessingContextInformationForErrorRecoveryIndexationTask(successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures);
+        ReprocessingContextInformation details = new ReprocessingContextInformationForErrorRecoveryIndexationTask(successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP);
         assertThatJson(jsonAdditionalInformationSerializer.serialize(details)).isEqualTo(SERIALIZED_ADDITIONAL_INFORMATION);
     }
 
     @Test
     void additonalInformationShouldBeDeserializable() throws IOException {
-        ReprocessingContextInformation details = new ReprocessingContextInformation(successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures);
+        ReprocessingContextInformation details = new ReprocessingContextInformationForErrorRecoveryIndexationTask(successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP);
         assertThat(jsonAdditionalInformationSerializer.deserialize(SERIALIZED_ADDITIONAL_INFORMATION))
             .isEqualToComparingFieldByField(details);
     }
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/FullReindexingTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/FullReindexingTaskSerializationTest.java
index 925a76c..6a54441 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/FullReindexingTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/FullReindexingTaskSerializationTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.indexer.ReIndexingExecutionFailures;
@@ -39,6 +40,8 @@ import com.google.common.collect.ImmutableList;
 
 class FullReindexingTaskSerializationTest {
 
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
     private ReIndexerPerformer reIndexerPerformer;
     private JsonTaskSerializer taskSerializer;
     private JsonTaskAdditionalInformationsSerializer jsonAdditionalInformationSerializer;
@@ -53,7 +56,7 @@ class FullReindexingTaskSerializationTest {
     private ReIndexingExecutionFailures reIndexingExecutionFailures;
 
     private final String serializedFullReindexingTask = "{\"type\": \"FullReIndexing\"}";
-    private final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"FullReIndexing\", \"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":[{\"mailboxId\":\"1\",\"uids\":[10]},{\"mailboxId\":\"2\",\"uids\":[20]}]}";
+    private final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"FullReIndexing\", \"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":[{\"mailboxId\":\"1\",\"uids\":[10]},{\"mailboxId\":\"2\",\"uids\":[20]}], \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     @BeforeEach
     void setUp() {
@@ -86,13 +89,13 @@ class FullReindexingTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws JsonProcessingException {
-        ReprocessingContextInformation details = new ReprocessingContextInformationForFullReindexingTask(successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures);
+        ReprocessingContextInformation details = new ReprocessingContextInformationForFullReindexingTask(successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP);
         assertThatJson(jsonAdditionalInformationSerializer.serialize(details)).isEqualTo(SERIALIZED_ADDITIONAL_INFORMATION);
     }
 
     @Test
     void additonalInformationShouldBeDeserializable() throws IOException {
-        ReprocessingContextInformation details = new ReprocessingContextInformation(successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures);
+        ReprocessingContextInformation details = new ReprocessingContextInformation(successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP);
         assertThat(jsonAdditionalInformationSerializer.deserialize(SERIALIZED_ADDITIONAL_INFORMATION))
             .isEqualToComparingFieldByField(details);
     }
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskSerializationTest.java
index 97fe1a5..5c276bf 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/MessageIdReindexingTaskSerializationTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.TestMessageId;
@@ -35,11 +36,13 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 
 class MessageIdReindexingTaskSerializationTest {
 
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
     private ReIndexerPerformer reIndexerPerformer;
     private MessageId.Factory messageIdFactory;
     private JsonTaskSerializer taskSerializer;
     private final String serializedMessageIdReIndexingTask = "{\"type\": \"MessageIdReIndexingTask\", \"messageId\": \"1\"}";
-    private final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"MessageIdReIndexingTask\", \"messageId\": \"1\"}";
+    private final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"MessageIdReIndexingTask\", \"messageId\": \"1\", \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     private JsonTaskAdditionalInformationsSerializer jsonAdditionalInformationSerializer;
 
@@ -74,14 +77,14 @@ class MessageIdReindexingTaskSerializationTest {
     @Test
     void additionalInformationShouldBeSerializable() throws JsonProcessingException {
         MessageId messageId = messageIdFactory.fromString("1");
-        MessageIdReIndexingTask.AdditionalInformation details = new MessageIdReIndexingTask.AdditionalInformation(messageId);
+        MessageIdReIndexingTask.AdditionalInformation details = new MessageIdReIndexingTask.AdditionalInformation(messageId, TIMESTAMP);
         assertThatJson(jsonAdditionalInformationSerializer.serialize(details)).isEqualTo(SERIALIZED_ADDITIONAL_INFORMATION);
     }
 
     @Test
     void additonalInformationShouldBeDeserializable() throws IOException {
         MessageId messageId = messageIdFactory.fromString("1");
-        MessageIdReIndexingTask.AdditionalInformation details = new MessageIdReIndexingTask.AdditionalInformation(messageId);
+        MessageIdReIndexingTask.AdditionalInformation details = new MessageIdReIndexingTask.AdditionalInformation(messageId, TIMESTAMP);
         assertThat(jsonAdditionalInformationSerializer.deserialize(SERIALIZED_ADDITIONAL_INFORMATION))
             .isEqualToComparingFieldByField(details);
     }
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskSerializationTest.java
index f3c0036..1be420f 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMailboxReindexingTaskSerializationTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 import java.util.List;
 
 import org.apache.james.mailbox.MessageUid;
@@ -38,6 +39,8 @@ import com.google.common.collect.ImmutableList;
 
 class SingleMailboxReindexingTaskSerializationTest {
 
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
     private ReIndexerPerformer reIndexerPerformer;
     private JsonTaskSerializer taskSerializer;
     private JsonTaskAdditionalInformationsSerializer jsonAdditionalInformationSerializer;
@@ -48,7 +51,7 @@ class SingleMailboxReindexingTaskSerializationTest {
 
     private final String serializedMailboxReindexingTask = "{\"type\": \"mailboxReIndexing\", \"mailboxId\": \"1\"}";
 
-    private final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"mailboxReIndexing\", \"mailboxId\": \"1\", \"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":[{\"mailboxId\":\"1\",\"uids\":[10, 20]}]}";
+    private final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"mailboxReIndexing\", \"mailboxId\": \"1\", \"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":[{\"mailboxId\":\"1\",\"uids\":[10, 20]}], \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     private final TestId mailboxId = TestId.of(1L);
     private final MessageUid messageUid = MessageUid.of(10L);
@@ -92,13 +95,13 @@ class SingleMailboxReindexingTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws JsonProcessingException {
-        SingleMailboxReindexingTask.AdditionalInformation details = new SingleMailboxReindexingTask.AdditionalInformation(mailboxId, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures);
+        SingleMailboxReindexingTask.AdditionalInformation details = new SingleMailboxReindexingTask.AdditionalInformation(mailboxId, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP);
         assertThatJson(jsonAdditionalInformationSerializer.serialize(details)).isEqualTo(SERIALIZED_ADDITIONAL_INFORMATION);
     }
 
     @Test
     void additonalInformationShouldBeDeserializable() throws IOException {
-        SingleMailboxReindexingTask.AdditionalInformation details = new SingleMailboxReindexingTask.AdditionalInformation(mailboxId, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures);
+        SingleMailboxReindexingTask.AdditionalInformation details = new SingleMailboxReindexingTask.AdditionalInformation(mailboxId, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP);
         assertThat(jsonAdditionalInformationSerializer.deserialize(SERIALIZED_ADDITIONAL_INFORMATION))
             .isEqualToComparingFieldByField(details);
     }
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskSerializationTest.java
index d6705c8..13984bc 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/SingleMessageReindexingTaskSerializationTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.TestId;
@@ -35,11 +36,13 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 
 class SingleMessageReindexingTaskSerializationTest {
 
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
     private final TestId.Factory mailboxIdFactory = new TestId.Factory();
     private ReIndexerPerformer reIndexerPerformer;
     private JsonTaskSerializer taskSerializer;
     private final String serializedMessageReindexingTask = "{\"type\": \"messageReIndexing\", \"mailboxId\": \"1\", \"uid\": 10}";
-    private final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"messageReIndexing\", \"mailboxId\": \"1\", \"uid\": 10}";
+    private final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"messageReIndexing\", \"mailboxId\": \"1\", \"uid\": 10, \"timestamp\":\"2018-11-13T12:00:55Z\"}";
     private final TestId mailboxId = TestId.of(1L);
     private final MessageUid messageUid = MessageUid.of(10L);
     private JsonTaskAdditionalInformationsSerializer jsonAdditionalInformationSerializer = new JsonTaskAdditionalInformationsSerializer(
@@ -70,13 +73,13 @@ class SingleMessageReindexingTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws JsonProcessingException {
-        SingleMessageReindexingTask.AdditionalInformation details = new SingleMessageReindexingTask.AdditionalInformation(mailboxId, messageUid);
+        SingleMessageReindexingTask.AdditionalInformation details = new SingleMessageReindexingTask.AdditionalInformation(mailboxId, messageUid, TIMESTAMP);
         assertThatJson(jsonAdditionalInformationSerializer.serialize(details)).isEqualTo(SERIALIZED_ADDITIONAL_INFORMATION);
     }
 
     @Test
     void additonalInformationShouldBeDeserializable() throws IOException {
-        SingleMessageReindexingTask.AdditionalInformation details = new SingleMessageReindexingTask.AdditionalInformation(mailboxId, messageUid);
+        SingleMessageReindexingTask.AdditionalInformation details = new SingleMessageReindexingTask.AdditionalInformation(mailboxId, messageUid, TIMESTAMP);
         assertThat(jsonAdditionalInformationSerializer.deserialize(SERIALIZED_ADDITIONAL_INFORMATION))
             .isEqualToComparingFieldByField(details);
     }
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
index 618fa70..cd73ac8 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/UserReindexingTaskSerializationTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 import java.util.List;
 
 import org.apache.james.core.User;
@@ -39,6 +40,8 @@ import com.google.common.collect.ImmutableList;
 
 class UserReindexingTaskSerializationTest {
 
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
     private ReIndexerPerformer reIndexerPerformer;
     private JsonTaskSerializer taskSerializer;
     private JsonTaskAdditionalInformationsSerializer jsonAdditionalInformationSerializer;
@@ -49,7 +52,7 @@ class UserReindexingTaskSerializationTest {
     private ReIndexingExecutionFailures reIndexingExecutionFailures;
     private final String serializedUserReindexingTask = "{\"type\": \"userReIndexing\", \"username\": \"foo@apache.org\"}";
 
-    private final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"userReIndexing\", \"user\": \"foo@apache.org\", \"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":[{\"mailboxId\":\"1\",\"uids\":[10]},{\"mailboxId\":\"2\",\"uids\":[20]}]}";
+    private final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"userReIndexing\", \"user\": \"foo@apache.org\", \"successfullyReprocessedMailCount\":42,\"failedReprocessedMailCount\":2,\"failures\":[{\"mailboxId\":\"1\",\"uids\":[10]},{\"mailboxId\":\"2\",\"uids\":[20]}], \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     private final TestId mailboxId = TestId.of(1L);
     private final MessageUid messageUid = MessageUid.of(10L);
@@ -95,13 +98,13 @@ class UserReindexingTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws JsonProcessingException {
-        UserReindexingTask.AdditionalInformation details = new UserReindexingTask.AdditionalInformation(user, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures);
+        UserReindexingTask.AdditionalInformation details = new UserReindexingTask.AdditionalInformation(user, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP);
         assertThatJson(jsonAdditionalInformationSerializer.serialize(details)).isEqualTo(SERIALIZED_ADDITIONAL_INFORMATION);
     }
 
     @Test
     void additionalInformationShouldBeDeserializable() throws IOException {
-        UserReindexingTask.AdditionalInformation details = new UserReindexingTask.AdditionalInformation(user, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures);
+        UserReindexingTask.AdditionalInformation details = new UserReindexingTask.AdditionalInformation(user, successfullyReprocessedMailCount, failedReprocessedMailCount, reIndexingExecutionFailures, TIMESTAMP);
         assertThat(jsonAdditionalInformationSerializer.deserialize(SERIALIZED_ADDITIONAL_INFORMATION))
             .isEqualToComparingFieldByField(details);
     }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java
index 31e1120..39f38b0 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.modules;
 
+import java.time.Clock;
+
 import org.apache.james.backends.cassandra.migration.MigrationTask;
 import org.apache.james.backends.cassandra.migration.MigrationTaskAdditionalInformationsDTO;
 import org.apache.james.backends.cassandra.migration.MigrationTaskDTO;
@@ -205,7 +207,7 @@ public class TaskSerializationModule extends AbstractModule {
 
     @ProvidesIntoSet
     public TaskDTOModule<?, ?> reprocessingOneMailsTask(ReprocessingService reprocessingService) {
-        return ReprocessingOneMailTaskDTO.module(reprocessingService);
+        return ReprocessingOneMailTaskDTO.module(Clock.systemUTC(), reprocessingService);
     }
 
     @ProvidesIntoSet
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigration.java b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigration.java
index dd61851..cc55a70 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigration.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigration.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.rrt.cassandra.migration;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -71,10 +73,12 @@ public class MappingsSourcesMigration implements Migration {
     public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
         private final long successfulMappingsCount;
         private final long errorMappingsCount;
+        private final Instant timestamp;
 
-        AdditionalInformation(long successfulMappingsCount, long errorMappingsCount) {
+        AdditionalInformation(long successfulMappingsCount, long errorMappingsCount, Instant timestamp) {
             this.successfulMappingsCount = successfulMappingsCount;
             this.errorMappingsCount = errorMappingsCount;
+            this.timestamp = timestamp;
         }
 
         public long getSuccessfulMappingsCount() {
@@ -84,6 +88,11 @@ public class MappingsSourcesMigration implements Migration {
         public long getErrorMappingsCount() {
             return errorMappingsCount;
         }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
     private final CassandraRecipientRewriteTableDAO cassandraRecipientRewriteTableDAO;
@@ -133,6 +142,7 @@ public class MappingsSourcesMigration implements Migration {
     AdditionalInformation createAdditionalInformation() {
         return new AdditionalInformation(
             successfulMappingsCount.get(),
-            errorMappingsCount.get());
+            errorMappingsCount.get(),
+            Clock.systemUTC().instant());
     }
 }
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskAdditionalInformationDTO.java b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskAdditionalInformationDTO.java
index 45cf96b..5ddf19b 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskAdditionalInformationDTO.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskAdditionalInformationDTO.java
@@ -20,6 +20,8 @@
 
 package org.apache.james.rrt.cassandra.migration;
 
+import java.time.Instant;
+
 import org.apache.james.json.DTOModule;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
@@ -33,7 +35,8 @@ public class MappingsSourcesMigrationTaskAdditionalInformationDTO implements Add
         return new MappingsSourcesMigrationTaskAdditionalInformationDTO(
             type,
             additionalInformation.getSuccessfulMappingsCount(),
-            additionalInformation.getErrorMappingsCount()
+            additionalInformation.getErrorMappingsCount(),
+            additionalInformation.timestamp()
         );
     }
 
@@ -49,22 +52,25 @@ public class MappingsSourcesMigrationTaskAdditionalInformationDTO implements Add
 
     private final String type;
     private final long successfulMappingsCount;
-    private final long errorMappinsCount;
+    private final long errorMappingsCount;
+    private final Instant timestamp;
 
     public MappingsSourcesMigrationTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                                 @JsonProperty("successfulMappingsCount") long successfulMappingsCount,
-                                                                @JsonProperty("errorMappinsCount") long errorMappinsCount) {
+                                                                @JsonProperty("errorMappingsCount") long errorMappingsCount,
+                                                                @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.successfulMappingsCount = successfulMappingsCount;
-        this.errorMappinsCount = errorMappinsCount;
+        this.errorMappingsCount = errorMappingsCount;
+        this.timestamp = timestamp;
     }
 
     public long getSuccessfulMappingsCount() {
         return successfulMappingsCount;
     }
 
-    public long getErrorMappinsCount() {
-        return errorMappinsCount;
+    public long getErrorMappingsCount() {
+        return errorMappingsCount;
     }
 
     @Override
@@ -72,10 +78,15 @@ public class MappingsSourcesMigrationTaskAdditionalInformationDTO implements Add
         return type;
     }
 
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
     private MappingsSourcesMigration.AdditionalInformation toDomainObject() {
         return new MappingsSourcesMigration.AdditionalInformation(
             successfulMappingsCount,
-            errorMappinsCount
+            errorMappingsCount,
+            timestamp
         );
     }
 }
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskSerializationTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskSerializationTest.java
index b2af55d..dfbdca2 100644
--- a/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskSerializationTest.java
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/rrt/cassandra/migration/MappingsSourcesMigrationTaskSerializationTest.java
@@ -25,6 +25,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 
 import org.apache.james.server.task.json.JsonTaskAdditionalInformationsSerializer;
 import org.apache.james.server.task.json.JsonTaskSerializer;
@@ -33,11 +34,12 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import org.junit.jupiter.api.Test;
 
 class MappingsSourcesMigrationTaskSerializationTest {
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
     private static final MappingsSourcesMigration MIGRATION = mock(MappingsSourcesMigration.class);
     private static final MappingsSourcesMigration.MappingsSourcesMigrationTask TASK = new MappingsSourcesMigration.MappingsSourcesMigrationTask(MIGRATION);
     private static final String SERIALIZED_TASK = "{\"type\": \"mappingsSourcesMigration\"}";
-    private static final MappingsSourcesMigration.AdditionalInformation DETAILS = new MappingsSourcesMigration.AdditionalInformation(42L, 10);
-    private static final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"mappingsSourcesMigration\", \"successfulMappingsCount\":42,\"errorMappinsCount\":10}";
+    private static final MappingsSourcesMigration.AdditionalInformation DETAILS = new MappingsSourcesMigration.AdditionalInformation(42L, 10, TIMESTAMP);
+    private static final String SERIALIZED_ADDITIONAL_INFORMATION = "{\"type\": \"mappingsSourcesMigration\", \"successfulMappingsCount\":42,\"errorMappingsCount\":10,\"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     private static final JsonTaskSerializer TASK_SERIALIZER = new JsonTaskSerializer(MappingsSourcesMigrationTaskDTO.MODULE.apply(MIGRATION));
     private static final JsonTaskAdditionalInformationsSerializer JSON_TASK_ADDITIONAL_INFORMATIONS_SERIALIZER = new JsonTaskAdditionalInformationsSerializer(MappingsSourcesMigrationTaskAdditionalInformationDTO.serializationModule(MappingsSourcesMigration.TYPE));
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java
index bb5f4e6..0ab9b08 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.webadmin.vault.routes;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 
 import javax.inject.Inject;
@@ -58,10 +60,12 @@ public class DeletedMessagesVaultDeleteTask implements Task {
 
         private final User user;
         private final MessageId deleteMessageId;
+        private final Instant timestamp;
 
-        AdditionalInformation(User user, MessageId deleteMessageId) {
+        AdditionalInformation(User user, MessageId deleteMessageId, Instant timestamp) {
             this.user = user;
             this.deleteMessageId = deleteMessageId;
+            this.timestamp = timestamp;
         }
 
         public String getUser() {
@@ -71,6 +75,11 @@ public class DeletedMessagesVaultDeleteTask implements Task {
         public String getDeleteMessageId() {
             return deleteMessageId.serialize();
         }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
     private final DeletedMessageVault vault;
@@ -107,7 +116,7 @@ public class DeletedMessagesVaultDeleteTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(new AdditionalInformation(user, messageId));
+        return Optional.of(new AdditionalInformation(user, messageId, Clock.systemUTC().instant()));
     }
 
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java
index ae55cbf..d5b1445 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.webadmin.vault.routes;
 
+import java.time.Instant;
+
 import org.apache.james.core.User;
 import org.apache.james.json.DTOModule;
 import org.apache.james.mailbox.model.MessageId;
@@ -31,8 +33,8 @@ public class DeletedMessagesVaultDeleteTaskAdditionalInformationDTO implements A
     public static AdditionalInformationDTOModule<DeletedMessagesVaultDeleteTask.AdditionalInformation, DeletedMessagesVaultDeleteTaskAdditionalInformationDTO> serializationModule(MessageId.Factory factory) {
         return DTOModule.forDomainObject(DeletedMessagesVaultDeleteTask.AdditionalInformation.class)
             .convertToDTO(DeletedMessagesVaultDeleteTaskAdditionalInformationDTO.class)
-            .toDomainObjectConverter(dto -> new DeletedMessagesVaultDeleteTask.AdditionalInformation(User.fromUsername(dto.userName), factory.fromString(dto.getMessageId())))
-            .toDTOConverter((details, type) -> new DeletedMessagesVaultDeleteTaskAdditionalInformationDTO(type, details.getUser(), details.getDeleteMessageId()))
+            .toDomainObjectConverter(dto -> new DeletedMessagesVaultDeleteTask.AdditionalInformation(User.fromUsername(dto.userName), factory.fromString(dto.getMessageId()), dto.getTimestamp()))
+            .toDTOConverter((details, type) -> new DeletedMessagesVaultDeleteTaskAdditionalInformationDTO(type, details.getUser(), details.getDeleteMessageId(), details.timestamp()))
             .typeName(DeletedMessagesVaultDeleteTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
     }
@@ -40,13 +42,16 @@ public class DeletedMessagesVaultDeleteTaskAdditionalInformationDTO implements A
     private final String type;
     private final String userName;
     private final String messageId;
+    private final Instant timestamp;
 
     public DeletedMessagesVaultDeleteTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                                   @JsonProperty("userName") String userName,
-                                                                  @JsonProperty("messageId") String messageId) {
+                                                                  @JsonProperty("messageId") String messageId,
+                                                                  @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.userName = userName;
         this.messageId = messageId;
+        this.timestamp = timestamp;
     }
 
     public String getMessageId() {
@@ -58,6 +63,11 @@ public class DeletedMessagesVaultDeleteTaskAdditionalInformationDTO implements A
     }
 
     @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    @Override
     public String getType() {
         return type;
     }
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTask.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTask.java
index 37357f6..3ca6b47 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTask.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTask.java
@@ -20,6 +20,8 @@
 package org.apache.james.webadmin.vault.routes;
 
 import java.io.IOException;
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -29,7 +31,6 @@ import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskType;
 import org.apache.james.vault.search.Query;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,11 +45,13 @@ public class DeletedMessagesVaultExportTask implements Task {
         private final User userExportFrom;
         private final MailAddress exportTo;
         private final long totalExportedMessages;
+        private final Instant timestamp;
 
-        public AdditionalInformation(User userExportFrom, MailAddress exportTo, long totalExportedMessages) {
+        public AdditionalInformation(User userExportFrom, MailAddress exportTo, long totalExportedMessages, Instant timestamp) {
             this.userExportFrom = userExportFrom;
             this.exportTo = exportTo;
             this.totalExportedMessages = totalExportedMessages;
+            this.timestamp = timestamp;
         }
 
         public String getUserExportFrom() {
@@ -62,6 +65,11 @@ public class DeletedMessagesVaultExportTask implements Task {
         public long getTotalExportedMessages() {
             return totalExportedMessages;
         }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
     private static final Logger LOGGER = LoggerFactory.getLogger(DeletedMessagesVaultExportTask.class);
@@ -100,7 +108,7 @@ public class DeletedMessagesVaultExportTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(new AdditionalInformation(userExportFrom, exportTo, totalExportedMessages.get()));
+        return Optional.of(new AdditionalInformation(userExportFrom, exportTo, totalExportedMessages.get(), Clock.systemUTC().instant()));
     }
 
     User getUserExportFrom() {
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskAdditionalInformationDTO.java
index 2e56836..76b3c23 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskAdditionalInformationDTO.java
@@ -20,6 +20,8 @@
 
 package org.apache.james.webadmin.vault.routes;
 
+import java.time.Instant;
+
 import javax.mail.internet.AddressException;
 
 import org.apache.james.core.MailAddress;
@@ -37,7 +39,8 @@ public class DeletedMessagesVaultExportTaskAdditionalInformationDTO implements A
             type,
             additionalInformation.getUserExportFrom(),
             additionalInformation.getExportTo(),
-            additionalInformation.getTotalExportedMessages()
+            additionalInformation.getTotalExportedMessages(),
+            additionalInformation.timestamp()
         );
     }
 
@@ -54,15 +57,18 @@ public class DeletedMessagesVaultExportTaskAdditionalInformationDTO implements A
     private final String userExportFrom;
     private final String exportTo;
     private final Long totalExportedMessages;
+    private final Instant timestamp;
 
     public DeletedMessagesVaultExportTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                                   @JsonProperty("user") String userExportFrom,
                                                                   @JsonProperty("exportTo") String exportTo,
-                                                                  @JsonProperty("errorRestoreCount") Long totalExportedMessages) {
+                                                                  @JsonProperty("errorRestoreCount") Long totalExportedMessages,
+                                                                  @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.userExportFrom = userExportFrom;
         this.exportTo = exportTo;
         this.totalExportedMessages = totalExportedMessages;
+        this.timestamp = timestamp;
     }
 
     public String getUserExportFrom() {
@@ -82,7 +88,8 @@ public class DeletedMessagesVaultExportTaskAdditionalInformationDTO implements A
             return new DeletedMessagesVaultExportTask.AdditionalInformation(
                 User.fromUsername(userExportFrom),
                 new MailAddress(exportTo),
-                totalExportedMessages
+                totalExportedMessages,
+                timestamp
             );
         } catch (AddressException e) {
             throw new RuntimeException(e);
@@ -93,4 +100,9 @@ public class DeletedMessagesVaultExportTaskAdditionalInformationDTO implements A
     public String getType() {
         return type;
     }
+
+    @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTask.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTask.java
index 4b06e4f..4b35ee4 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTask.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTask.java
@@ -21,6 +21,8 @@ package org.apache.james.webadmin.vault.routes;
 
 import static org.apache.james.webadmin.vault.routes.RestoreService.RestoreResult.RESTORE_SUCCEED;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -43,11 +45,13 @@ public class DeletedMessagesVaultRestoreTask implements Task {
         private final User user;
         private final long successfulRestoreCount;
         private final long errorRestoreCount;
+        private final Instant timestamp;
 
-        AdditionalInformation(User user, long successfulRestoreCount, long errorRestoreCount) {
+        AdditionalInformation(User user, long successfulRestoreCount, long errorRestoreCount, Instant timestamp) {
             this.user = user;
             this.successfulRestoreCount = successfulRestoreCount;
             this.errorRestoreCount = errorRestoreCount;
+            this.timestamp = timestamp;
         }
 
         public long getSuccessfulRestoreCount() {
@@ -61,6 +65,11 @@ public class DeletedMessagesVaultRestoreTask implements Task {
         public String getUser() {
             return user.asString();
         }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
     private static final Logger LOGGER = LoggerFactory.getLogger(DeletedMessagesVaultRestoreTask.class);
@@ -127,7 +136,7 @@ public class DeletedMessagesVaultRestoreTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(new AdditionalInformation(userToRestore, successfulRestoreCount.get(), errorRestoreCount.get()));
+        return Optional.of(new AdditionalInformation(userToRestore, successfulRestoreCount.get(), errorRestoreCount.get(), Clock.systemUTC().instant()));
     }
 
     User getUserToRestore() {
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java
index 6582a61..5f0d630 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.java
@@ -20,6 +20,8 @@
 
 package org.apache.james.webadmin.vault.routes;
 
+import java.time.Instant;
+
 import org.apache.james.core.User;
 import org.apache.james.json.DTOModule;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
@@ -34,7 +36,8 @@ public class DeletedMessagesVaultRestoreTaskAdditionalInformationDTO implements
             type,
             additionalInformation.getUser(),
             additionalInformation.getSuccessfulRestoreCount(),
-            additionalInformation.getErrorRestoreCount()
+            additionalInformation.getErrorRestoreCount(),
+            additionalInformation.timestamp()
         );
     }
 
@@ -51,15 +54,18 @@ public class DeletedMessagesVaultRestoreTaskAdditionalInformationDTO implements
     private final String user;
     private final Long successfulRestoreCount;
     private final Long errorRestoreCount;
+    private final Instant timestamp;
 
     public DeletedMessagesVaultRestoreTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                                    @JsonProperty("user") String user,
                                                                    @JsonProperty("successfulRestoreCount") Long successfulRestoreCount,
-                                                                   @JsonProperty("errorRestoreCount") Long errorRestoreCount) {
+                                                                   @JsonProperty("errorRestoreCount") Long errorRestoreCount,
+                                                                   @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.user = user;
         this.successfulRestoreCount = successfulRestoreCount;
         this.errorRestoreCount = errorRestoreCount;
+        this.timestamp = timestamp;
     }
 
     public String getUser() {
@@ -78,11 +84,17 @@ public class DeletedMessagesVaultRestoreTaskAdditionalInformationDTO implements
         return new DeletedMessagesVaultRestoreTask.AdditionalInformation(
             User.fromUsername(user),
             successfulRestoreCount,
-            errorRestoreCount
+            errorRestoreCount,
+            timestamp
         );
     }
 
     @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    @Override
     public String getType() {
         return type;
     }
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskSerializationTest.java
index 349cda7..bba39d9 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTaskSerializationTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 
 import org.apache.james.core.User;
 import org.apache.james.mailbox.model.MessageId;
@@ -37,6 +38,8 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 
 class DeletedMessagesVaultDeleteTaskSerializationTest {
 
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
     private DeletedMessageVault deletedMessageVault;
     private JsonTaskSerializer taskSerializer;
     private final String username = "james";
@@ -46,7 +49,7 @@ class DeletedMessagesVaultDeleteTaskSerializationTest {
     private final MessageId messageId = messageIdFactory.generate();
 
     private final String serializedDeleteMessagesVaultDeleteTask = "{\"type\": \"deletedMessages/delete\", \"userName\":\"james\", \"messageId\": \"" + messageId.serialize() + "\"}";
-    private final String serializedAdditionalInformation = "{\"type\": \"deletedMessages/delete\", \"userName\":\"james\", \"messageId\": \"" + messageId.serialize() + "\"}";
+    private final String serializedAdditionalInformation = "{\"type\": \"deletedMessages/delete\", \"userName\":\"james\", \"messageId\": \"" + messageId.serialize() + "\", \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     private JsonTaskAdditionalInformationsSerializer jsonAdditionalInformationSerializer;
 
@@ -77,13 +80,13 @@ class DeletedMessagesVaultDeleteTaskSerializationTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws JsonProcessingException {
-        DeletedMessagesVaultDeleteTask.AdditionalInformation details = new DeletedMessagesVaultDeleteTask.AdditionalInformation(user, messageId);
+        DeletedMessagesVaultDeleteTask.AdditionalInformation details = new DeletedMessagesVaultDeleteTask.AdditionalInformation(user, messageId, TIMESTAMP);
         assertThatJson(jsonAdditionalInformationSerializer.serialize(details)).isEqualTo(serializedAdditionalInformation);
     }
 
     @Test
     void additonalInformationShouldBeDeserializable() throws IOException {
-        DeletedMessagesVaultDeleteTask.AdditionalInformation details = new DeletedMessagesVaultDeleteTask.AdditionalInformation(user, messageId);
+        DeletedMessagesVaultDeleteTask.AdditionalInformation details = new DeletedMessagesVaultDeleteTask.AdditionalInformation(user, messageId, TIMESTAMP);
         assertThat(jsonAdditionalInformationSerializer.deserialize(serializedAdditionalInformation))
             .isEqualToComparingFieldByField(details);
     }
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java
index ab01f44..e62a7b2 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultExportTaskSerializationTest.java
@@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 
 import javax.mail.internet.AddressException;
 
@@ -44,6 +45,8 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 
 class DeletedMessagesVaultExportTaskSerializationTest {
 
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
     private ExportService exportService;
     private final TestId.Factory mailboxIdFactory = new TestId.Factory();
     private final QueryTranslator queryTranslator = new QueryTranslator(mailboxIdFactory);
@@ -60,14 +63,14 @@ class DeletedMessagesVaultExportTaskSerializationTest {
         "\"userExportFrom\":\"james\"," +
         "\"exportQuery\":{\"combinator\":\"and\",\"criteria\":[{\"fieldName\":\"hasAttachment\",\"operator\":\"equals\",\"value\":\"true\"}]}," +
         "\"exportTo\":\"james@apache.org\"}\n";
-    private static final String SERIALIZED_ADDITIONAL_INFORMATION_TASK = "{\"type\":\"deletedMessages/export\", \"exportTo\":\"james@apache.org\",\"userExportFrom\":\"james\",\"totalExportedMessages\":42}";
+    private static final String SERIALIZED_ADDITIONAL_INFORMATION_TASK = "{\"type\":\"deletedMessages/export\", \"exportTo\":\"james@apache.org\",\"userExportFrom\":\"james\",\"totalExportedMessages\":42, \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     private static final JsonTaskAdditionalInformationsSerializer JSON_TASK_ADDITIONAL_INFORMATIONS_SERIALIZER = new JsonTaskAdditionalInformationsSerializer(DeletedMessagesVaultExportTaskAdditionalInformationDTO.MODULE);
 
     @BeforeAll
     static void init() throws AddressException {
         exportTo = new MailAddress("james@apache.org");
-        details = new DeletedMessagesVaultExportTask.AdditionalInformation(USER_EXPORT_FROM, exportTo, 42);
+        details = new DeletedMessagesVaultExportTask.AdditionalInformation(USER_EXPORT_FROM, exportTo, 42, TIMESTAMP);
     }
 
     @BeforeEach
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java
index 6304f96..50c3810 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRestoreTaskSerializationTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 
 import org.apache.james.core.User;
 import org.apache.james.mailbox.model.TestId;
@@ -39,6 +40,8 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 
 class DeletedMessagesVaultRestoreTaskSerializationTest {
 
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
     private RestoreService exportService;
     private final TestId.Factory mailboxIdFactory = new TestId.Factory();
     private final QueryTranslator queryTranslator = new QueryTranslator(mailboxIdFactory);
@@ -48,13 +51,13 @@ class DeletedMessagesVaultRestoreTaskSerializationTest {
     private static final String USERNAME = "james";
     private static final User USER_TO_RESTORE = User.fromUsername(USERNAME);
     private static final Query QUERY = Query.of(CriterionFactory.hasAttachment(true));
-    private static final DeletedMessagesVaultRestoreTask.AdditionalInformation DETAILS = new DeletedMessagesVaultRestoreTask.AdditionalInformation(USER_TO_RESTORE,42, 10);
+    private static final DeletedMessagesVaultRestoreTask.AdditionalInformation DETAILS = new DeletedMessagesVaultRestoreTask.AdditionalInformation(USER_TO_RESTORE,42, 10, TIMESTAMP);
 
     private static final String SERIALIZED_DELETE_MESSAGES_VAULT_RESTORE_TASK = "{\"type\":\"deletedMessages/restore\"," +
         "\"userToRestore\":\"james\"," +
         "\"query\":{\"combinator\":\"and\",\"criteria\":[{\"fieldName\":\"hasAttachment\",\"operator\":\"equals\",\"value\":\"true\"}]}" +
         "}";
-    private static final String SERIALIZED_ADDITIONAL_INFORMATION_TASK = "{\"type\":\"deletedMessages/restore\", \"user\":\"james\",\"successfulRestoreCount\":42,\"errorRestoreCount\":10}";
+    private static final String SERIALIZED_ADDITIONAL_INFORMATION_TASK = "{\"type\":\"deletedMessages/restore\", \"user\":\"james\",\"successfulRestoreCount\":42,\"errorRestoreCount\":10, \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     private static final JsonTaskAdditionalInformationsSerializer JSON_TASK_ADDITIONAL_INFORMATIONS_SERIALIZER = new JsonTaskAdditionalInformationsSerializer(DeletedMessagesVaultRestoreTaskAdditionalInformationDTO.MODULE);
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverAllTask.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverAllTask.java
index d23f0d4..9087e0b 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverAllTask.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverAllTask.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.webadmin.service;
 
+import java.time.Clock;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -81,6 +82,7 @@ public class EventDeadLettersRedeliverAllTask implements Task {
     EventDeadLettersRedeliveryTaskAdditionalInformation createAdditionalInformation() {
         return new EventDeadLettersRedeliveryTaskAdditionalInformationForAll(
             successfulRedeliveriesCount.get(),
-            failedRedeliveriesCount.get());
+            failedRedeliveriesCount.get(),
+            Clock.systemUTC().instant());
     }
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverGroupTask.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverGroupTask.java
index 678e3cd..71958fb 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverGroupTask.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverGroupTask.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.webadmin.service;
 
+import java.time.Clock;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -89,6 +90,7 @@ public class EventDeadLettersRedeliverGroupTask implements Task {
         return new EventDeadLettersRedeliveryTaskAdditionalInformationForGroup(
             successfulRedeliveriesCount.get(),
             failedRedeliveriesCount.get(),
-            eventRetriever.forGroup());
+            eventRetriever.forGroup(),
+            Clock.systemUTC().instant());
     }
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverOneTask.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverOneTask.java
index d1a0973..8b15859 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverOneTask.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverOneTask.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.webadmin.service;
 
+import java.time.Clock;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -27,7 +28,6 @@ import org.apache.james.mailbox.events.Group;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskType;
-import org.apache.james.webadmin.service.EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForOne;
 
 public class EventDeadLettersRedeliverOneTask implements Task {
     public static final TaskType TYPE = TaskType.of("eventDeadLettersRedeliverOneTask");
@@ -93,10 +93,11 @@ public class EventDeadLettersRedeliverOneTask implements Task {
     }
 
     EventDeadLettersRedeliveryTaskAdditionalInformation createAdditionalInformation() {
-        return new EventDeadLettersRedeliveryTaskAdditionalInformationForOne(
+        return new EventDeadLettersRedeliveryTaskAdditionalInformationDTO.EventDeadLettersRedeliveryTaskAdditionalInformationForOne(
             successfulRedeliveriesCount.get(),
             failedRedeliveriesCount.get(),
             eventRetriever.forGroup(),
-            eventRetriever.forEvent());
+            eventRetriever.forEvent(),
+            Clock.systemUTC().instant());
     }
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformation.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformation.java
index a6028ac..95efa3f 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformation.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformation.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.webadmin.service;
 
+import java.time.Instant;
 import java.util.Optional;
 
 import org.apache.james.mailbox.events.EventDeadLetters;
@@ -31,13 +32,18 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformation implements Task
     private final long failedRedeliveriesCount;
     private final Optional<Group> group;
     private final Optional<EventDeadLetters.InsertionId> insertionId;
+    private final Instant timestamp;
 
-    EventDeadLettersRedeliveryTaskAdditionalInformation(long successfulRedeliveriesCount, long failedRedeliveriesCount,
-                                                        Optional<Group> group, Optional<EventDeadLetters.InsertionId> insertionId) {
+    EventDeadLettersRedeliveryTaskAdditionalInformation(long successfulRedeliveriesCount,
+                                                        long failedRedeliveriesCount,
+                                                        Optional<Group> group,
+                                                        Optional<EventDeadLetters.InsertionId> insertionId,
+                                                        Instant timestamp) {
         this.successfulRedeliveriesCount = successfulRedeliveriesCount;
         this.failedRedeliveriesCount = failedRedeliveriesCount;
         this.group = group;
         this.insertionId = insertionId;
+        this.timestamp = timestamp;
     }
 
     public long getSuccessfulRedeliveriesCount() {
@@ -57,4 +63,9 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformation implements Task
     public Optional<String> getInsertionId() {
         return insertionId.map(insertionId -> insertionId.getId().toString());
     }
+
+    @Override
+    public Instant timestamp() {
+        return timestamp;
+    }
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformationDTO.java
index f3ee084..46dce06 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/EventDeadLettersRedeliveryTaskAdditionalInformationDTO.java
@@ -1,5 +1,6 @@
 package org.apache.james.webadmin.service;
 
+import java.time.Instant;
 import java.util.Optional;
 
 import org.apache.james.json.DTOModule;
@@ -23,8 +24,8 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformationDTO implements A
                 .withFactory(AdditionalInformationDTOModule::new);
 
 
-        EventDeadLettersRedeliveryTaskAdditionalInformationForAll(long successfulRedeliveriesCount, long failedRedeliveriesCount) {
-            super(successfulRedeliveriesCount, failedRedeliveriesCount, Optional.empty(), Optional.empty());
+        EventDeadLettersRedeliveryTaskAdditionalInformationForAll(long successfulRedeliveriesCount, long failedRedeliveriesCount, Instant timestamp) {
+            super(successfulRedeliveriesCount, failedRedeliveriesCount, Optional.empty(), Optional.empty(), timestamp);
         }
     }
 
@@ -39,8 +40,8 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformationDTO implements A
                 .withFactory(AdditionalInformationDTOModule::new);
 
 
-        EventDeadLettersRedeliveryTaskAdditionalInformationForGroup(long successfulRedeliveriesCount, long failedRedeliveriesCount, Optional<Group> group) {
-            super(successfulRedeliveriesCount, failedRedeliveriesCount, group, Optional.empty());
+        EventDeadLettersRedeliveryTaskAdditionalInformationForGroup(long successfulRedeliveriesCount, long failedRedeliveriesCount, Optional<Group> group, Instant timestamp) {
+            super(successfulRedeliveriesCount, failedRedeliveriesCount, group, Optional.empty(), timestamp);
         }
     }
 
@@ -55,8 +56,13 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformationDTO implements A
                 .withFactory(AdditionalInformationDTOModule::new);
 
 
-        EventDeadLettersRedeliveryTaskAdditionalInformationForOne(long successfulRedeliveriesCount, long failedRedeliveriesCount, Optional<Group> group, Optional<EventDeadLetters.InsertionId> insertionId) {
-            super(successfulRedeliveriesCount, failedRedeliveriesCount, group, insertionId);
+        EventDeadLettersRedeliveryTaskAdditionalInformationForOne(
+            long successfulRedeliveriesCount,
+            long failedRedeliveriesCount,
+            Optional<Group> group,
+            Optional<EventDeadLetters.InsertionId> insertionId,
+            Instant timestamp) {
+            super(successfulRedeliveriesCount, failedRedeliveriesCount, group, insertionId, timestamp);
         }
     }
 
@@ -66,20 +72,23 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformationDTO implements A
             domainObject.getSuccessfulRedeliveriesCount(),
             domainObject.getFailedRedeliveriesCount(),
             domainObject.getGroup(),
-            domainObject.getInsertionId());
+            domainObject.getInsertionId(),
+            domainObject.timestamp());
     }
 
     private static EventDeadLettersRedeliveryTaskAdditionalInformationForAll fromAll(EventDeadLettersRedeliveryTaskAdditionalInformationDTO dto) {
         return new EventDeadLettersRedeliveryTaskAdditionalInformationForAll(
             dto.successfulRedeliveriesCount,
-            dto.failedRedeliveriesCount);
+            dto.failedRedeliveriesCount,
+            dto.timestamp);
     }
 
     private static EventDeadLettersRedeliveryTaskAdditionalInformationForGroup fromGroup(EventDeadLettersRedeliveryTaskAdditionalInformationDTO dto) {
         return new EventDeadLettersRedeliveryTaskAdditionalInformationForGroup(
             dto.successfulRedeliveriesCount,
             dto.failedRedeliveriesCount,
-            dto.group.map(Throwing.function(Group::deserialize).sneakyThrow()));
+            dto.group.map(Throwing.function(Group::deserialize).sneakyThrow()),
+            dto.timestamp);
     }
 
     private static EventDeadLettersRedeliveryTaskAdditionalInformationForOne fromOne(EventDeadLettersRedeliveryTaskAdditionalInformationDTO dto) {
@@ -87,7 +96,8 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformationDTO implements A
             dto.successfulRedeliveriesCount,
             dto.failedRedeliveriesCount,
             dto.group.map(Throwing.function(Group::deserialize).sneakyThrow()),
-            dto.insertionId.map(EventDeadLetters.InsertionId::of));
+            dto.insertionId.map(EventDeadLetters.InsertionId::of),
+            dto.timestamp);
     }
 
     private final String type;
@@ -95,18 +105,21 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformationDTO implements A
     private final long failedRedeliveriesCount;
     private final Optional<String> group;
     private final Optional<String> insertionId;
+    private final Instant timestamp;
 
     public EventDeadLettersRedeliveryTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                                   @JsonProperty("successfulRedeliveriesCount") long successfulRedeliveriesCount,
                                                                   @JsonProperty("failedRedeliveriesCount") long failedRedeliveriesCount,
                                                                   @JsonProperty("group") Optional<String> group,
-                                                                  @JsonProperty("insertionId") Optional<String> insertionId
+                                                                  @JsonProperty("insertionId") Optional<String> insertionId,
+                                                                  @JsonProperty("timestamp") Instant timestamp
     ) {
         this.type = type;
         this.successfulRedeliveriesCount = successfulRedeliveriesCount;
         this.failedRedeliveriesCount = failedRedeliveriesCount;
         this.group = group;
         this.insertionId = insertionId;
+        this.timestamp = timestamp;
     }
 
 
@@ -127,6 +140,11 @@ public class EventDeadLettersRedeliveryTaskAdditionalInformationDTO implements A
     }
 
     @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    @Override
     public String getType() {
         return type;
     }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTaskTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTaskTest.java
index 2e4d451..b7cda3c 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/service/EventDeadLettersRedeliverTaskTest.java
@@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 import java.util.Optional;
 import java.util.stream.Stream;
 
@@ -46,12 +47,13 @@ import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 
 class EventDeadLettersRedeliverTaskTest {
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
     private static final String SERIALIZED_ALL = "{\"type\":\"eventDeadLettersRedeliverAllTask\"}";
     private static final String SERIALIZED_GROUP = "{\"type\":\"eventDeadLettersRedeliverGroupTask\",\"group\":\"org.apache.james.mailbox.events.GenericGroup-abc\"}";
     private static final String SERIALIZED_ONE = "{\"type\":\"eventDeadLettersRedeliverOneTask\",\"group\":\"org.apache.james.mailbox.events.GenericGroup-abc\",\"insertionId\":\"fcbc3c92-e9a0-4ece-94ed-6e6b45045258\"}";
-    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION_ALL = "{\"type\":\"eventDeadLettersRedeliverAllTask\",\"successfulRedeliveriesCount\":10,\"failedRedeliveriesCount\":4}";
-    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION_GROUP = "{\"type\":\"eventDeadLettersRedeliverGroupTask\",\"successfulRedeliveriesCount\":10,\"failedRedeliveriesCount\":4,\"group\":\"org.apache.james.mailbox.events.GenericGroup-foo\"}";
-    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION_ONE = "{\"type\":\"eventDeadLettersRedeliverOneTask\",\"successfulRedeliveriesCount\":10,\"failedRedeliveriesCount\":4,\"group\":\"org.apache.james.mailbox.events.GenericGroup-foo\",\"insertionId\":\"53db3dd9-80eb-476f-b25a-722ad364905a\"}";
+    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION_ALL = "{\"type\":\"eventDeadLettersRedeliverAllTask\",\"successfulRedeliveriesCount\":10,\"failedRedeliveriesCount\":4, \"timestamp\":\"2018-11-13T12:00:55Z\"}";
+    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION_GROUP = "{\"type\":\"eventDeadLettersRedeliverGroupTask\",\"successfulRedeliveriesCount\":10,\"failedRedeliveriesCount\":4,\"group\":\"org.apache.james.mailbox.events.GenericGroup-foo\", \"timestamp\":\"2018-11-13T12:00:55Z\"}";
+    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION_ONE = "{\"type\":\"eventDeadLettersRedeliverOneTask\",\"successfulRedeliveriesCount\":10,\"failedRedeliveriesCount\":4,\"group\":\"org.apache.james.mailbox.events.GenericGroup-foo\",\"insertionId\":\"53db3dd9-80eb-476f-b25a-722ad364905a\", \"timestamp\":\"2018-11-13T12:00:55Z\"}";
     private static final EventDeadLettersRedeliverService SERVICE = mock(EventDeadLettersRedeliverService.class);
     private static final EventDeadLettersRedeliverAllTask TASK_ALL = new EventDeadLettersRedeliverAllTask(SERVICE);
     private static final EventDeadLettersRedeliverGroupTask TASK_GROUP = new EventDeadLettersRedeliverGroupTask(SERVICE, new GenericGroup("abc"));
@@ -104,15 +106,15 @@ class EventDeadLettersRedeliverTaskTest {
     static Stream<Arguments> additionalInformation() {
         return Stream.of(
             Arguments.of(
-                new EventDeadLettersRedeliveryTaskAdditionalInformationForAll(SUCCESSFUL_REDELIVERY_COUNT, FAILED_REDELIVERY_COUNT),
+                new EventDeadLettersRedeliveryTaskAdditionalInformationForAll(SUCCESSFUL_REDELIVERY_COUNT, FAILED_REDELIVERY_COUNT, TIMESTAMP),
                 SERIALIZED_TASK_ADDITIONAL_INFORMATION_ALL,
                 "eventDeadLettersRedeliverAllTask"),
             Arguments.of(
-                new EventDeadLettersRedeliveryTaskAdditionalInformationForGroup(SUCCESSFUL_REDELIVERY_COUNT, FAILED_REDELIVERY_COUNT, SOME_GROUP),
+                new EventDeadLettersRedeliveryTaskAdditionalInformationForGroup(SUCCESSFUL_REDELIVERY_COUNT, FAILED_REDELIVERY_COUNT, SOME_GROUP, TIMESTAMP),
                 SERIALIZED_TASK_ADDITIONAL_INFORMATION_GROUP,
                 "eventDeadLettersRedeliverGroupTask"),
             Arguments.of(
-                new EventDeadLettersRedeliveryTaskAdditionalInformationForOne(SUCCESSFUL_REDELIVERY_COUNT, FAILED_REDELIVERY_COUNT, SOME_GROUP, SOME_INSERTION_ID),
+                new EventDeadLettersRedeliveryTaskAdditionalInformationForOne(SUCCESSFUL_REDELIVERY_COUNT, FAILED_REDELIVERY_COUNT, SOME_GROUP, SOME_INSERTION_ID, TIMESTAMP),
                 SERIALIZED_TASK_ADDITIONAL_INFORMATION_ONE,
                 "eventDeadLettersRedeliverOneTask")
         );
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTask.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTask.java
index f8db79f..ff4d777 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTask.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTask.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.webadmin.service;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 
 import org.apache.james.queue.api.MailQueue;
@@ -35,11 +37,13 @@ public class ClearMailQueueTask implements Task {
         private final String mailQueueName;
         private final long initialCount;
         private final long remainingCount;
+        private final Instant timestamp;
 
-        public AdditionalInformation(String mailQueueName, long initialCount, long remainingCount) {
+        public AdditionalInformation(String mailQueueName, long initialCount, long remainingCount, Instant timestamp) {
             this.mailQueueName = mailQueueName;
             this.initialCount = initialCount;
             this.remainingCount = remainingCount;
+            this.timestamp = timestamp;
         }
 
         public String getMailQueueName() {
@@ -53,6 +57,11 @@ public class ClearMailQueueTask implements Task {
         public long getRemainingCount() {
             return remainingCount;
         }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
     public static class UnknownSerializedQueue extends RuntimeException {
@@ -91,7 +100,7 @@ public class ClearMailQueueTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(new AdditionalInformation(queue.getName(), initialCount, getRemainingSize()));
+        return Optional.of(new AdditionalInformation(queue.getName(), initialCount, getRemainingSize(), Clock.systemUTC().instant()));
     }
 
     ManageableMailQueue getQueue() {
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskAdditionalInformationDTO.java
index 0c240bd..94763a1 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskAdditionalInformationDTO.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.webadmin.service;
 
+import java.time.Instant;
+
 import org.apache.james.json.DTOModule;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
@@ -32,13 +34,15 @@ public class ClearMailQueueTaskAdditionalInformationDTO implements AdditionalInf
             .toDomainObjectConverter(dto -> new ClearMailQueueTask.AdditionalInformation(
                 dto.mailQueueName,
                 dto.initialCount,
-                dto.remainingCount
+                dto.remainingCount,
+                dto.timestamp
             ))
             .toDTOConverter((details, type) -> new ClearMailQueueTaskAdditionalInformationDTO(
                 type,
                 details.getMailQueueName(),
                 details.getInitialCount(),
-                details.getRemainingCount()))
+                details.getRemainingCount(),
+                details.timestamp()))
             .typeName(ClearMailQueueTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
 
@@ -46,15 +50,18 @@ public class ClearMailQueueTaskAdditionalInformationDTO implements AdditionalInf
     private final String type;
     private final long initialCount;
     private final long remainingCount;
+    private final Instant timestamp;
 
     public ClearMailQueueTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                       @JsonProperty("mailQueueName") String mailQueueName,
                                                       @JsonProperty("initialCount") long initialCount,
-                                                      @JsonProperty("remainingCount") long remainingCount) {
+                                                      @JsonProperty("remainingCount") long remainingCount,
+                                                      @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.mailQueueName = mailQueueName;
         this.initialCount = initialCount;
         this.remainingCount = remainingCount;
+        this.timestamp = timestamp;
     }
 
     public String getMailQueueName() {
@@ -73,4 +80,9 @@ public class ClearMailQueueTaskAdditionalInformationDTO implements AdditionalInf
     public String getType() {
         return type;
     }
+
+    @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
 }
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java
index ec5a14c..e55b7d6 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.webadmin.service;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 
 import org.apache.james.core.MailAddress;
@@ -42,10 +44,11 @@ public class DeleteMailsFromMailQueueTask implements Task {
         private final Optional<String> sender;
         private final Optional<String> name;
         private final Optional<String> recipient;
+        private final Instant timestamp;
 
         public AdditionalInformation(String mailQueueName, long initialCount, long remainingCount,
                                      Optional<MailAddress> maybeSender, Optional<String> maybeName,
-                                     Optional<MailAddress> maybeRecipient) {
+                                     Optional<MailAddress> maybeRecipient, Instant timestamp) {
             this.mailQueueName = mailQueueName;
             this.initialCount = initialCount;
             this.remainingCount = remainingCount;
@@ -53,6 +56,7 @@ public class DeleteMailsFromMailQueueTask implements Task {
             sender = maybeSender.map(MailAddress::asString);
             name = maybeName;
             recipient = maybeRecipient.map(MailAddress::asString);
+            this.timestamp = timestamp;
         }
 
         public String getMailQueueName() {
@@ -78,6 +82,11 @@ public class DeleteMailsFromMailQueueTask implements Task {
         public Optional<String> getRecipient() {
             return recipient;
         }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
     public static class UnknownSerializedQueue extends RuntimeException {
@@ -146,7 +155,7 @@ public class DeleteMailsFromMailQueueTask implements Task {
         return Optional.of(new AdditionalInformation(queue.getName(),
             initialCount,
             getRemainingSize(), maybeSender,
-            maybeName, maybeRecipient));
+            maybeName, maybeRecipient, Clock.systemUTC().instant()));
     }
 
     public long getRemainingSize() {
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
index 74e44c6..f4c2928 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
@@ -1,5 +1,6 @@
 package org.apache.james.webadmin.service;
 
+import java.time.Instant;
 import java.util.Optional;
 
 import org.apache.james.core.MailAddress;
@@ -29,7 +30,8 @@ public class DeleteMailsFromMailQueueTaskAdditionalInformationDTO implements Add
             domainObject.getName(),
             domainObject.getRecipient(),
             domainObject.getInitialCount(),
-            domainObject.getRemainingCount());
+            domainObject.getRemainingCount(),
+            domainObject.timestamp());
     }
 
     private static DeleteMailsFromMailQueueTask.AdditionalInformation fromDTO(DeleteMailsFromMailQueueTaskAdditionalInformationDTO dto) {
@@ -39,7 +41,8 @@ public class DeleteMailsFromMailQueueTaskAdditionalInformationDTO implements Add
             dto.getRemainingCount(),
             dto.sender.map(Throwing.<String, MailAddress>function(MailAddress::new).sneakyThrow()),
             dto.name,
-            dto.recipient.map(Throwing.<String, MailAddress>function(MailAddress::new).sneakyThrow()));
+            dto.recipient.map(Throwing.<String, MailAddress>function(MailAddress::new).sneakyThrow()),
+            dto.timestamp);
     }
 
 
@@ -50,6 +53,7 @@ public class DeleteMailsFromMailQueueTaskAdditionalInformationDTO implements Add
     private final Optional<String> recipient;
     private final long initialCount;
     private final long remainingCount;
+    private final Instant timestamp;
 
     public DeleteMailsFromMailQueueTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                                 @JsonProperty("queue") String queue,
@@ -57,7 +61,8 @@ public class DeleteMailsFromMailQueueTaskAdditionalInformationDTO implements Add
                                                                 @JsonProperty("name") Optional<String> name,
                                                                 @JsonProperty("recipient") Optional<String> recipient,
                                                                 @JsonProperty("initialCount") long initialCount,
-                                                                @JsonProperty("remainingCount") long remainingCount
+                                                                @JsonProperty("remainingCount") long remainingCount,
+                                                                @JsonProperty("timestamp") Instant timestamp
     ) {
         this.type = type;
         this.queue = queue;
@@ -66,6 +71,7 @@ public class DeleteMailsFromMailQueueTaskAdditionalInformationDTO implements Add
         this.recipient = recipient;
         this.initialCount = initialCount;
         this.remainingCount = remainingCount;
+        this.timestamp = timestamp;
     }
 
 
@@ -94,6 +100,11 @@ public class DeleteMailsFromMailQueueTaskAdditionalInformationDTO implements Add
     }
 
     @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    @Override
     public String getType() {
         return type;
     }
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/ClearMailQueueTaskTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/ClearMailQueueTaskTest.java
index 4dbd21f..bb6cd92 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/ClearMailQueueTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/ClearMailQueueTaskTest.java
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.io.IOException;
+import java.time.Instant;
 import java.util.Optional;
 
 import org.apache.james.queue.api.MailQueueFactory;
@@ -38,13 +39,14 @@ import net.javacrumbs.jsonunit.assertj.JsonAssertions;
 
 class ClearMailQueueTaskTest {
 
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
     private static final String SERIALIZED = "{\"type\": \"clear-mail-queue\", \"queue\": \"anyQueue\"}";
     private static final String QUEUE_NAME = "anyQueue";
     private static final long INITIAL_COUNT = 0L;
     private static final long REMAINING_COUNT = 10L;
     private JsonTaskAdditionalInformationsSerializer jsonAdditionalInformationSerializer = new JsonTaskAdditionalInformationsSerializer(
         ClearMailQueueTaskAdditionalInformationDTO.SERIALIZATION_MODULE);
-    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION = "{\"type\": \"clear-mail-queue\", \"mailQueueName\":\"anyQueue\",\"initialCount\":0,\"remainingCount\":10}";
+    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION = "{\"type\": \"clear-mail-queue\", \"mailQueueName\":\"anyQueue\",\"initialCount\":0,\"remainingCount\":10, \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     @Test
     void taskShouldBeSerializable() throws Exception {
@@ -85,13 +87,13 @@ class ClearMailQueueTaskTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws JsonProcessingException {
-        ClearMailQueueTask.AdditionalInformation details = new ClearMailQueueTask.AdditionalInformation(QUEUE_NAME, INITIAL_COUNT, REMAINING_COUNT);
+        ClearMailQueueTask.AdditionalInformation details = new ClearMailQueueTask.AdditionalInformation(QUEUE_NAME, INITIAL_COUNT, REMAINING_COUNT, TIMESTAMP);
         assertThatJson(jsonAdditionalInformationSerializer.serialize(details)).isEqualTo(SERIALIZED_TASK_ADDITIONAL_INFORMATION);
     }
 
     @Test
     void additionalInformationShouldBeDeserializable() throws IOException {
-        ClearMailQueueTask.AdditionalInformation details = new ClearMailQueueTask.AdditionalInformation(QUEUE_NAME, INITIAL_COUNT, REMAINING_COUNT);
+        ClearMailQueueTask.AdditionalInformation details = new ClearMailQueueTask.AdditionalInformation(QUEUE_NAME, INITIAL_COUNT, REMAINING_COUNT, TIMESTAMP);
         assertThat(jsonAdditionalInformationSerializer.deserialize(SERIALIZED_TASK_ADDITIONAL_INFORMATION))
             .isEqualToComparingFieldByField(details);
     }
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskTest.java
index adee47e..33092c5 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskTest.java
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.io.IOException;
+import java.time.Instant;
 import java.util.Optional;
 import java.util.stream.Stream;
 
@@ -45,6 +46,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 
 class DeleteMailsFromMailQueueTaskTest {
 
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
     private MailQueueFactory<ManageableMailQueue> mailQueueFactory;
     private ManageableMailQueue mockedQueue;
     private final static String queueName = "anyQueue";
@@ -117,9 +119,9 @@ class DeleteMailsFromMailQueueTaskTest {
 
     private static Stream<Arguments> validAdditionalInformations() throws Exception {
         return Stream.of(
-            Arguments.of(10L, 5L, Optional.of(new MailAddress("a@b.c")), Optional.empty(), Optional.empty(), "{\"type\": \"delete-mails-from-mail-queue\", \"queue\": \"anyQueue\", \"sender\": \"a@b.c\", \"initialCount\" : 10, \"remainingCount\":5}"),
-            Arguments.of(1L, 0L, Optional.empty(), Optional.of("name"), Optional.empty(), "{\"type\": \"delete-mails-from-mail-queue\", \"queue\": \"anyQueue\", \"name\": \"name\", \"initialCount\" : 1, \"remainingCount\":0}"),
-            Arguments.of(6L, 6L, Optional.empty(), Optional.empty(), Optional.of(new MailAddress("d@e.f")), "{\"type\": \"delete-mails-from-mail-queue\", \"queue\": \"anyQueue\", \"recipient\": \"d@e.f\", \"initialCount\" : 6, \"remainingCount\":6}")
+            Arguments.of(10L, 5L, Optional.of(new MailAddress("a@b.c")), Optional.empty(), Optional.empty(), "{\"type\": \"delete-mails-from-mail-queue\", \"queue\": \"anyQueue\", \"sender\": \"a@b.c\", \"initialCount\" : 10, \"remainingCount\":5, \"timestamp\": \"2018-11-13T12:00:55Z\"}"),
+            Arguments.of(1L, 0L, Optional.empty(), Optional.of("name"), Optional.empty(), "{\"type\": \"delete-mails-from-mail-queue\", \"queue\": \"anyQueue\", \"name\": \"name\", \"initialCount\" : 1, \"remainingCount\":0, \"timestamp\": \"2018-11-13T12:00:55Z\"}"),
+            Arguments.of(6L, 6L, Optional.empty(), Optional.empty(), Optional.of(new MailAddress("d@e.f")), "{\"type\": \"delete-mails-from-mail-queue\", \"queue\": \"anyQueue\", \"recipient\": \"d@e.f\", \"initialCount\" : 6, \"remainingCount\":6, \"timestamp\": \"2018-11-13T12:00:55Z\"}")
         );
     }
 
@@ -133,7 +135,7 @@ class DeleteMailsFromMailQueueTaskTest {
                                                    String serializedAdditionalInformationJson) throws JsonProcessingException {
 
         ManageableMailQueue queue = mailQueueFactory.getQueue(queueName).get();
-        DeleteMailsFromMailQueueTask.AdditionalInformation details = new DeleteMailsFromMailQueueTask.AdditionalInformation(queue.getName(), initialCount, remainingCount, sender, name, recipient);
+        DeleteMailsFromMailQueueTask.AdditionalInformation details = new DeleteMailsFromMailQueueTask.AdditionalInformation(queue.getName(), initialCount, remainingCount, sender, name, recipient, TIMESTAMP);
 
         assertThatJson(jsonAdditionalInformationsSerializer.serialize(details)).isEqualTo(serializedAdditionalInformationJson);
     }
@@ -150,7 +152,7 @@ class DeleteMailsFromMailQueueTaskTest {
                                                      Optional<String> name,
                                                      Optional<MailAddress> recipient,
                                                      String serializedAdditionalInformationJson) throws IOException {
-        DeleteMailsFromMailQueueTask.AdditionalInformation details = new DeleteMailsFromMailQueueTask.AdditionalInformation(queueName, initialCount, remainingCount, sender, name, recipient);
+        DeleteMailsFromMailQueueTask.AdditionalInformation details = new DeleteMailsFromMailQueueTask.AdditionalInformation(queueName, initialCount, remainingCount, sender, name, recipient, TIMESTAMP);
 
         assertThat(jsonAdditionalInformationsSerializer.deserialize(serializedAdditionalInformationJson))
             .isEqualToComparingFieldByField(details);
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java
index 7a956a1..c9fc45e 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java
@@ -22,6 +22,7 @@ package org.apache.james.webadmin.routes;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.time.Clock;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
@@ -499,7 +500,7 @@ public class MailRepositoriesRoutes implements Routes {
         Optional<String> targetProcessor = Optional.ofNullable(request.queryParams("processor"));
         String targetQueue = Optional.ofNullable(request.queryParams("queue")).orElse(MailQueueFactory.SPOOL);
 
-        return new ReprocessingOneMailTask(reprocessingService, path, targetQueue, key, targetProcessor);
+        return new ReprocessingOneMailTask(reprocessingService, path, targetQueue, key, targetProcessor, Clock.systemUTC());
     }
 
     private void enforceActionParameter(Request request) {
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTask.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTask.java
index 824a83e..268f518 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTask.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTask.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.webadmin.service;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.List;
 import java.util.Optional;
 
@@ -58,11 +60,13 @@ public class ClearMailRepositoryTask implements Task {
         private final MailRepositoryPath repositoryPath;
         private final long initialCount;
         private final long remainingCount;
+        private final Instant timestamp;
 
-        public AdditionalInformation(MailRepositoryPath repositoryPath, long initialCount, long remainingCount) {
+        public AdditionalInformation(MailRepositoryPath repositoryPath, long initialCount, long remainingCount, Instant timestamp) {
             this.repositoryPath = repositoryPath;
             this.initialCount = initialCount;
             this.remainingCount = remainingCount;
+            this.timestamp = timestamp;
         }
 
         public String getRepositoryPath() {
@@ -76,6 +80,11 @@ public class ClearMailRepositoryTask implements Task {
         public long getInitialCount() {
             return initialCount;
         }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
     public static class UrlEncodingFailureSerializationException extends RuntimeException {
@@ -128,7 +137,7 @@ public class ClearMailRepositoryTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(new AdditionalInformation(mailRepositoryPath, initialCount, getRemainingSize()));
+        return Optional.of(new AdditionalInformation(mailRepositoryPath, initialCount, getRemainingSize(), Clock.systemUTC().instant()));
     }
 
     public long getRemainingSize() {
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskAdditionalInformationDTO.java
index bc08a14..2b9d9f7 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskAdditionalInformationDTO.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.webadmin.service;
 
+import java.time.Instant;
+
 import org.apache.james.json.DTOModule;
 import org.apache.james.mailrepository.api.MailRepositoryPath;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
@@ -33,13 +35,15 @@ public class ClearMailRepositoryTaskAdditionalInformationDTO implements Addition
             .toDomainObjectConverter(dto -> new ClearMailRepositoryTask.AdditionalInformation(
                 MailRepositoryPath.from(dto.mailRepositoryPath),
                 dto.initialCount,
-                dto.remainingCount
+                dto.remainingCount,
+                dto.timestamp
             ))
             .toDTOConverter((details, type) -> new ClearMailRepositoryTaskAdditionalInformationDTO(
                 type,
                 details.getRepositoryPath(),
                 details.getInitialCount(),
-                details.getRemainingCount()))
+                details.getRemainingCount(),
+                details.timestamp()))
             .typeName(ClearMailRepositoryTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
 
@@ -47,15 +51,18 @@ public class ClearMailRepositoryTaskAdditionalInformationDTO implements Addition
     private final String type;
     private final long initialCount;
     private final long remainingCount;
+    private final Instant timestamp;
 
     public ClearMailRepositoryTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                            @JsonProperty("mailRepositoryPath") String mailRepositoryPath,
                                                            @JsonProperty("initialCount") long initialCount,
-                                                           @JsonProperty("remainingCount") long remainingCount) {
+                                                           @JsonProperty("remainingCount") long remainingCount,
+                                                           @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.mailRepositoryPath = mailRepositoryPath;
         this.initialCount = initialCount;
         this.remainingCount = remainingCount;
+        this.timestamp = timestamp;
     }
 
     public String getMailRepositoryPath() {
@@ -70,6 +77,10 @@ public class ClearMailRepositoryTaskAdditionalInformationDTO implements Addition
         return remainingCount;
     }
 
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
     @Override
     public String getType() {
         return type;
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java
index f524027..fc731ea 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.webadmin.service;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -41,13 +43,15 @@ public class ReprocessingAllMailsTask implements Task {
         private final Optional<String> targetProcessor;
         private final long initialCount;
         private final long remainingCount;
+        private final Instant timestamp;
 
-        public AdditionalInformation(MailRepositoryPath repositoryPath, String targetQueue, Optional<String> targetProcessor, long initialCount, long remainingCount) {
+        public AdditionalInformation(MailRepositoryPath repositoryPath, String targetQueue, Optional<String> targetProcessor, long initialCount, long remainingCount, Instant timestamp) {
             this.repositoryPath = repositoryPath;
             this.targetQueue = targetQueue;
             this.targetProcessor = targetProcessor;
             this.initialCount = initialCount;
             this.remainingCount = remainingCount;
+            this.timestamp = timestamp;
         }
 
         public String getTargetQueue() {
@@ -70,6 +74,10 @@ public class ReprocessingAllMailsTask implements Task {
             return initialCount;
         }
 
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
     public static class UrlEncodingFailureSerializationException extends RuntimeException {
@@ -142,7 +150,8 @@ public class ReprocessingAllMailsTask implements Task {
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
         return Optional.of(new AdditionalInformation(
-            repositoryPath, targetQueue, targetProcessor, repositorySize, repositorySize - processedCount.get()));
+            repositoryPath, targetQueue, targetProcessor, repositorySize, repositorySize - processedCount.get(),
+            Clock.systemUTC().instant()));
     }
 
 }
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskAdditionalInformationDTO.java
index 6f773c2..15b8cee 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskAdditionalInformationDTO.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.webadmin.service;
 
+import java.time.Instant;
 import java.util.Optional;
 
 import org.apache.james.json.DTOModule;
@@ -37,7 +38,8 @@ public class ReprocessingAllMailsTaskAdditionalInformationDTO implements Additio
                 dto.targetQueue,
                 dto.targetProcessor,
                 dto.initialCount,
-                dto.remainingCount
+                dto.remainingCount,
+                dto.timestamp
             ))
             .toDTOConverter((details, type) -> new ReprocessingAllMailsTaskAdditionalInformationDTO(
                 type,
@@ -45,7 +47,8 @@ public class ReprocessingAllMailsTaskAdditionalInformationDTO implements Additio
                 details.getTargetQueue(),
                 details.getTargetProcessor(),
                 details.getInitialCount(),
-                details.getRemainingCount()))
+                details.getRemainingCount(),
+                details.timestamp()))
             .typeName(ReprocessingAllMailsTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
 
@@ -55,6 +58,7 @@ public class ReprocessingAllMailsTaskAdditionalInformationDTO implements Additio
     private final Optional<String> targetProcessor;
     private final long initialCount;
     private final long remainingCount;
+    private final Instant timestamp;
 
     public ReprocessingAllMailsTaskAdditionalInformationDTO(
         @JsonProperty("type") String type,
@@ -62,13 +66,15 @@ public class ReprocessingAllMailsTaskAdditionalInformationDTO implements Additio
         @JsonProperty("targetQueue") String targetQueue,
         @JsonProperty("targetProcessor") Optional<String> targetProcessor,
         @JsonProperty("initialCount") long initialCount,
-        @JsonProperty("remainingCount") long remainingCount) {
+        @JsonProperty("remainingCount") long remainingCount,
+        @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.repositoryPath = repositoryPath;
         this.targetQueue = targetQueue;
         this.targetProcessor = targetProcessor;
         this.initialCount = initialCount;
         this.remainingCount = remainingCount;
+        this.timestamp = timestamp;
     }
 
     @Override
@@ -92,6 +98,10 @@ public class ReprocessingAllMailsTaskAdditionalInformationDTO implements Additio
         return targetQueue;
     }
 
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
     public Optional<String> getTargetProcessor() {
         return targetProcessor;
     }
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java
index b4e260b..c470bcd 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.webadmin.service;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Optional;
 
 import javax.mail.MessagingException;
@@ -39,12 +41,14 @@ public class ReprocessingOneMailTask implements Task {
         private final String targetQueue;
         private final MailKey mailKey;
         private final Optional<String> targetProcessor;
+        private final Instant timestamp;
 
-        public AdditionalInformation(MailRepositoryPath repositoryPath, String targetQueue, MailKey mailKey, Optional<String> targetProcessor) {
+        public AdditionalInformation(MailRepositoryPath repositoryPath, String targetQueue, MailKey mailKey, Optional<String> targetProcessor, Instant timestamp) {
             this.repositoryPath = repositoryPath;
             this.targetQueue = targetQueue;
             this.mailKey = mailKey;
             this.targetProcessor = targetProcessor;
+            this.timestamp = timestamp;
         }
 
         public String getMailKey() {
@@ -62,6 +66,11 @@ public class ReprocessingOneMailTask implements Task {
         public String getRepositoryPath() {
             return repositoryPath.asString();
         }
+
+        @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
     }
 
     public static class UrlEncodingFailureSerializationException extends RuntimeException {
@@ -86,13 +95,17 @@ public class ReprocessingOneMailTask implements Task {
     private final AdditionalInformation additionalInformation;
 
     public ReprocessingOneMailTask(ReprocessingService reprocessingService,
-                                   MailRepositoryPath repositoryPath, String targetQueue, MailKey mailKey, Optional<String> targetProcessor) {
+                                   MailRepositoryPath repositoryPath,
+                                   String targetQueue,
+                                   MailKey mailKey,
+                                   Optional<String> targetProcessor,
+                                   Clock clock) {
         this.reprocessingService = reprocessingService;
         this.repositoryPath = repositoryPath;
         this.targetQueue = targetQueue;
         this.mailKey = mailKey;
         this.targetProcessor = targetProcessor;
-        this.additionalInformation = new AdditionalInformation(repositoryPath, targetQueue, mailKey, targetProcessor);
+        this.additionalInformation = new AdditionalInformation(repositoryPath, targetQueue, mailKey, targetProcessor, clock.instant());
     }
 
     @Override
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskAdditionalInformationDTO.java
index 3133dd5..528caf5 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskAdditionalInformationDTO.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.webadmin.service;
 
+import java.time.Instant;
 import java.util.Optional;
 
 import org.apache.james.json.DTOModule;
@@ -37,14 +38,16 @@ public class ReprocessingOneMailTaskAdditionalInformationDTO implements Addition
                 MailRepositoryPath.from(dto.repositoryPath),
                 dto.targetQueue,
                 new MailKey(dto.mailKey),
-                dto.targetProcessor
+                dto.targetProcessor,
+                dto.timestamp
             ))
             .toDTOConverter((details, type) -> new ReprocessingOneMailTaskAdditionalInformationDTO(
                 type,
                 details.getRepositoryPath(),
                 details.getTargetQueue(),
                 details.getMailKey(),
-                details.getTargetProcessor()))
+                details.getTargetProcessor(),
+                details.timestamp()))
             .typeName(ReprocessingOneMailTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
 
@@ -53,17 +56,20 @@ public class ReprocessingOneMailTaskAdditionalInformationDTO implements Addition
     private final String targetQueue;
     private final String mailKey;
     private final Optional<String> targetProcessor;
+    private final Instant timestamp;
 
     public ReprocessingOneMailTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                            @JsonProperty("repositoryPath") String repositoryPath,
                                                            @JsonProperty("targetQueue") String targetQueue,
                                                            @JsonProperty("mailKey") String mailKey,
-                                                           @JsonProperty("targetProcessor") Optional<String> targetProcessor) {
+                                                           @JsonProperty("targetProcessor") Optional<String> targetProcessor,
+                                                           @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.repositoryPath = repositoryPath;
         this.targetQueue = targetQueue;
         this.mailKey = mailKey;
         this.targetProcessor = targetProcessor;
+        this.timestamp = timestamp;
     }
 
     @Override
@@ -83,6 +89,10 @@ public class ReprocessingOneMailTaskAdditionalInformationDTO implements Addition
         return mailKey;
     }
 
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
     public Optional<String> getTargetProcessor() {
         return targetProcessor;
     }
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskDTO.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskDTO.java
index 58c2fad..462e598 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskDTO.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskDTO.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.webadmin.service;
 
+import java.time.Clock;
 import java.util.Optional;
 
 import org.apache.james.json.DTOModule;
@@ -30,11 +31,11 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class ReprocessingOneMailTaskDTO implements TaskDTO {
 
-    public static final TaskDTOModule<ReprocessingOneMailTask, ReprocessingOneMailTaskDTO> module(ReprocessingService reprocessingService) {
+    public static TaskDTOModule<ReprocessingOneMailTask, ReprocessingOneMailTaskDTO> module(Clock clock, ReprocessingService reprocessingService) {
         return DTOModule
             .forDomainObject(ReprocessingOneMailTask.class)
             .convertToDTO(ReprocessingOneMailTaskDTO.class)
-            .toDomainObjectConverter(dto -> dto.fromDTO(reprocessingService))
+            .toDomainObjectConverter(dto -> dto.fromDTO(reprocessingService, clock))
             .toDTOConverter(ReprocessingOneMailTaskDTO::toDTO)
             .typeName(ReprocessingOneMailTask.TYPE.asString())
             .withFactory(TaskDTOModule::new);
@@ -72,13 +73,14 @@ public class ReprocessingOneMailTaskDTO implements TaskDTO {
         this.targetProcessor = targetProcessor;
     }
 
-    public ReprocessingOneMailTask fromDTO(ReprocessingService reprocessingService) {
+    public ReprocessingOneMailTask fromDTO(ReprocessingService reprocessingService, Clock clock) {
         return new ReprocessingOneMailTask(
             reprocessingService,
             getMailRepositoryPath(),
             targetQueue,
             new MailKey(mailKey),
-            targetProcessor
+            targetProcessor,
+            clock
         );
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskTest.java
index 5647635..1505b0a 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ClearMailRepositoryTaskTest.java
@@ -25,6 +25,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 
 import org.apache.james.mailrepository.api.MailRepository;
 import org.apache.james.mailrepository.api.MailRepositoryPath;
@@ -38,8 +39,11 @@ import com.google.common.collect.ImmutableList;
 import net.javacrumbs.jsonunit.assertj.JsonAssertions;
 
 class ClearMailRepositoryTaskTest {
+
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+
     private static final String SERIALIZED = "{\"type\":\"clearMailRepository\",\"mailRepositoryPath\":\"a\"}";
-    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION = "{\"type\":\"clearMailRepository\", \"mailRepositoryPath\":\"a\", \"initialCount\": 0, \"remainingCount\": 10}";
+    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION = "{\"type\":\"clearMailRepository\", \"mailRepositoryPath\":\"a\", \"initialCount\": 0, \"remainingCount\": 10, \"timestamp\":\"2018-11-13T12:00:55Z\"}";
     private static final ClearMailRepositoryTask.Factory FACTORY = new ClearMailRepositoryTask.Factory(mock(MailRepositoryStore.class));
     private static final ImmutableList<MailRepository> MAIL_REPOSITORIES = ImmutableList.of();
     private static final MailRepositoryPath MAIL_REPOSITORY_PATH = MailRepositoryPath.from("a");
@@ -74,13 +78,13 @@ class ClearMailRepositoryTaskTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws JsonProcessingException {
-        ClearMailRepositoryTask.AdditionalInformation details = new ClearMailRepositoryTask.AdditionalInformation(MAIL_REPOSITORY_PATH, INITIAL_COUNT, REMAINING_COUNT);
+        ClearMailRepositoryTask.AdditionalInformation details = new ClearMailRepositoryTask.AdditionalInformation(MAIL_REPOSITORY_PATH, INITIAL_COUNT, REMAINING_COUNT, TIMESTAMP);
         assertThatJson(jsonAdditionalInformationSerializer.serialize(details)).isEqualTo(SERIALIZED_TASK_ADDITIONAL_INFORMATION);
     }
 
     @Test
     void additionalInformationShouldBeDeserializable() throws IOException {
-        ClearMailRepositoryTask.AdditionalInformation details = new ClearMailRepositoryTask.AdditionalInformation(MAIL_REPOSITORY_PATH, INITIAL_COUNT, REMAINING_COUNT);
+        ClearMailRepositoryTask.AdditionalInformation details = new ClearMailRepositoryTask.AdditionalInformation(MAIL_REPOSITORY_PATH, INITIAL_COUNT, REMAINING_COUNT, TIMESTAMP);
         assertThat(jsonAdditionalInformationSerializer.deserialize(SERIALIZED_TASK_ADDITIONAL_INFORMATION))
             .isEqualToComparingFieldByField(details);
     }
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskTest.java
index 10c9153..1910472 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskTest.java
@@ -25,6 +25,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Instant;
 import java.util.Optional;
 import java.util.stream.Stream;
 
@@ -40,6 +41,8 @@ import org.junit.jupiter.params.provider.ValueSource;
 import com.fasterxml.jackson.core.JsonProcessingException;
 
 class ReprocessingAllMailsTaskTest {
+
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
     private static final ReprocessingService REPROCESSING_SERVICE = mock(ReprocessingService.class);
     private JsonTaskAdditionalInformationsSerializer jsonAdditionalInformationSerializer = new JsonTaskAdditionalInformationsSerializer(ReprocessingAllMailsTaskAdditionalInformationDTO.SERIALIZATION_MODULE);
     private static final long REPOSITORY_SIZE = 5L;
@@ -50,8 +53,8 @@ class ReprocessingAllMailsTaskTest {
     private static final long REMAINING_COUNT = 3L;
     private static final String SERIALIZED_TASK_WITH_TARGET_PROCESSOR = "{\"type\":\"reprocessingAllTask\",\"repositorySize\":5,\"repositoryPath\":\"a\",\"targetQueue\":\"queue\",\"targetProcessor\":\"targetProcessor\"}";
     private static final String SERIALIZED_TASK_WITHOUT_TARGET_PROCESSOR = "{\"type\":\"reprocessingAllTask\",\"repositorySize\":5,\"repositoryPath\":\"a\",\"targetQueue\":\"queue\"}";
-    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION_WITH_TARGET_PROCESSOR = "{\"type\":\"reprocessingAllTask\", \"repositoryPath\":\"a\",\"targetQueue\":\"queue\",\"targetProcessor\":\"targetProcessor\",\"initialCount\":5,\"remainingCount\":3}";
-    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION_WITHOUT_TARGET_PROCESSOR = "{\"type\":\"reprocessingAllTask\", \"repositoryPath\":\"a\",\"targetQueue\":\"queue\", \"initialCount\":5,\"remainingCount\":3}";
+    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION_WITH_TARGET_PROCESSOR = "{\"type\":\"reprocessingAllTask\", \"repositoryPath\":\"a\",\"targetQueue\":\"queue\",\"targetProcessor\":\"targetProcessor\",\"initialCount\":5,\"remainingCount\":3, \"timestamp\":\"2018-11-13T12:00:55Z\"}";
+    private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION_WITHOUT_TARGET_PROCESSOR = "{\"type\":\"reprocessingAllTask\", \"repositoryPath\":\"a\",\"targetQueue\":\"queue\", \"initialCount\":5,\"remainingCount\":3, \"timestamp\":\"2018-11-13T12:00:55Z\"}";
 
     @ParameterizedTest
     @MethodSource
@@ -120,7 +123,7 @@ class ReprocessingAllMailsTaskTest {
                                                    long repositorySize,
                                                    long remainingCount,
                                                    String serialized) throws JsonProcessingException {
-        ReprocessingAllMailsTask.AdditionalInformation details = new ReprocessingAllMailsTask.AdditionalInformation(repositoryPath, targetQueue, targetProcessor, repositorySize, remainingCount);
+        ReprocessingAllMailsTask.AdditionalInformation details = new ReprocessingAllMailsTask.AdditionalInformation(repositoryPath, targetQueue, targetProcessor, repositorySize, remainingCount, TIMESTAMP);
         assertThatJson(jsonAdditionalInformationSerializer.serialize(details)).isEqualTo(serialized);
     }
 
@@ -136,7 +139,7 @@ class ReprocessingAllMailsTaskTest {
                                                      long repositorySize,
                                                      long remainingCount,
                                                      String serialized) throws IOException {
-        ReprocessingAllMailsTask.AdditionalInformation details = new ReprocessingAllMailsTask.AdditionalInformation(repositoryPath, targetQueue, targetProcessor, repositorySize, remainingCount);
+        ReprocessingAllMailsTask.AdditionalInformation details = new ReprocessingAllMailsTask.AdditionalInformation(repositoryPath, targetQueue, targetProcessor, repositorySize, remainingCount, TIMESTAMP);
         assertThat(jsonAdditionalInformationSerializer.deserialize(serialized))
             .isEqualToComparingFieldByField(details);
     }
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskTest.java
index 7743e24..51248b8 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskTest.java
@@ -25,6 +25,9 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.Mockito.mock;
 
 import java.io.IOException;
+import java.time.Clock;
+import java.time.Instant;
+import java.time.ZoneId;
 import java.util.Optional;
 import java.util.stream.Stream;
 
@@ -42,9 +45,12 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import net.javacrumbs.jsonunit.assertj.JsonAssertions;
 
 class ReprocessingOneMailTaskTest {
+
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
+    private static final Clock CLOCK = Clock.fixed(TIMESTAMP, ZoneId.of("UTC"));
     private static final ReprocessingService REPROCESSING_SERVICE = mock(ReprocessingService.class);
     private static final String SERIALIZED_TASK_1 = "{\"type\":\"reprocessingOneTask\",\"repositoryPath\":\"a\",\"targetQueue\":\"queue\",\"mailKey\": \"myMail\",\"targetProcessor\":\"targetProcessor\"}";
-    private static final String SERIALIZED_TASK_1_ADDITIONAL_INFORMATION = "{\"type\":\"reprocessingOneTask\", \"repositoryPath\":\"a\",\"targetQueue\":\"queue\",\"mailKey\": \"myMail\",\"targetProcessor\":\"targetProcessor\"}";
+    private static final String SERIALIZED_TASK_1_ADDITIONAL_INFORMATION = "{\"type\":\"reprocessingOneTask\", \"repositoryPath\":\"a\",\"targetQueue\":\"queue\",\"mailKey\": \"myMail\",\"targetProcessor\":\"targetProcessor\", \"timestamp\":\"2018-11-13T12:00:55Z\"}";
     private static final MailRepositoryPath REPOSITORY_PATH = MailRepositoryPath.from("a");
     private static final String TARGET_QUEUE = "queue";
     private static final MailKey MAIL_KEY = new MailKey("myMail");
@@ -58,8 +64,8 @@ class ReprocessingOneMailTaskTest {
                                   MailKey mailKey,
                                   Optional<String> targetProcessor,
                                   String serialized) throws JsonProcessingException {
-        JsonTaskSerializer testee = new JsonTaskSerializer(ReprocessingOneMailTaskDTO.module(REPROCESSING_SERVICE));
-        ReprocessingOneMailTask task = new ReprocessingOneMailTask(REPROCESSING_SERVICE, repositoryPath, targetQueue, mailKey, targetProcessor);
+        JsonTaskSerializer testee = new JsonTaskSerializer(ReprocessingOneMailTaskDTO.module(CLOCK, REPROCESSING_SERVICE));
+        ReprocessingOneMailTask task = new ReprocessingOneMailTask(REPROCESSING_SERVICE, repositoryPath, targetQueue, mailKey, targetProcessor, CLOCK);
         JsonAssertions.assertThatJson(testee.serialize(task))
             .isEqualTo(serialized);
     }
@@ -75,8 +81,8 @@ class ReprocessingOneMailTaskTest {
                                     MailKey mailKey,
                                     Optional<String> targetProcessor,
                                     String serialized) throws IOException {
-        JsonTaskSerializer testee = new JsonTaskSerializer(ReprocessingOneMailTaskDTO.module(REPROCESSING_SERVICE));
-        ReprocessingOneMailTask task = new ReprocessingOneMailTask(REPROCESSING_SERVICE, repositoryPath, targetQueue, mailKey, targetProcessor);
+        JsonTaskSerializer testee = new JsonTaskSerializer(ReprocessingOneMailTaskDTO.module(CLOCK, REPROCESSING_SERVICE));
+        ReprocessingOneMailTask task = new ReprocessingOneMailTask(REPROCESSING_SERVICE, repositoryPath, targetQueue, mailKey, targetProcessor, CLOCK);
 
         assertThat(testee.deserialize(serialized))
             .isEqualToComparingFieldByFieldRecursively(task);
@@ -96,7 +102,7 @@ class ReprocessingOneMailTaskTest {
     @ParameterizedTest
     @ValueSource(strings = {"{\"type\":\"reprocessingOneTask\",\"repositoryPath\":\"%\",\"targetQueue\":\"queue\",\"mailKey\": \"myMail\",\"targetProcessor\":\"targetProcessor\"}", "{\"type\":\"reprocessingOneTask\",\"repositoryPath\":\"%\",\"targetQueue\":\"queue\",\"mailKey\": \"myMail\"}"})
     void taskShouldThrowOnDeserializationUrlDecodingError(String serialized) {
-        JsonTaskSerializer testee = new JsonTaskSerializer(ReprocessingOneMailTaskDTO.module(REPROCESSING_SERVICE));
+        JsonTaskSerializer testee = new JsonTaskSerializer(ReprocessingOneMailTaskDTO.module(CLOCK, REPROCESSING_SERVICE));
 
         assertThatThrownBy(() -> testee.deserialize(serialized))
             .isInstanceOf(ReprocessingOneMailTask.InvalidMailRepositoryPathDeserializationException.class);
@@ -104,13 +110,13 @@ class ReprocessingOneMailTaskTest {
 
     @Test
     void additionalInformationShouldBeSerializable() throws JsonProcessingException {
-        ReprocessingOneMailTask.AdditionalInformation details = new ReprocessingOneMailTask.AdditionalInformation(REPOSITORY_PATH, TARGET_QUEUE, MAIL_KEY, TARGET_PROCESSOR);
+        ReprocessingOneMailTask.AdditionalInformation details = new ReprocessingOneMailTask.AdditionalInformation(REPOSITORY_PATH, TARGET_QUEUE, MAIL_KEY, TARGET_PROCESSOR, TIMESTAMP);
         assertThatJson(jsonAdditionalInformationSerializer.serialize(details)).isEqualTo(SERIALIZED_TASK_1_ADDITIONAL_INFORMATION);
     }
 
     @Test
     void additonalInformationShouldBeDeserializable() throws IOException {
-        ReprocessingOneMailTask.AdditionalInformation details = new ReprocessingOneMailTask.AdditionalInformation(REPOSITORY_PATH, TARGET_QUEUE, MAIL_KEY, TARGET_PROCESSOR);
+        ReprocessingOneMailTask.AdditionalInformation details = new ReprocessingOneMailTask.AdditionalInformation(REPOSITORY_PATH, TARGET_QUEUE, MAIL_KEY, TARGET_PROCESSOR, TIMESTAMP);
         assertThat(jsonAdditionalInformationSerializer.deserialize(SERIALIZED_TASK_1_ADDITIONAL_INFORMATION))
             .isEqualToComparingFieldByField(details);
     }
diff --git a/server/task/task-api/src/main/scala/org/apache/james/task/TaskExecutionDetails.scala b/server/task/task-api/src/main/scala/org/apache/james/task/TaskExecutionDetails.scala
index b331907..c0fd884 100644
--- a/server/task/task-api/src/main/scala/org/apache/james/task/TaskExecutionDetails.scala
+++ b/server/task/task-api/src/main/scala/org/apache/james/task/TaskExecutionDetails.scala
@@ -19,7 +19,7 @@
 
 package org.apache.james.task
 
-import java.time.ZonedDateTime
+import java.time.{Instant, ZonedDateTime}
 import java.util.{Objects, Optional}
 
 import com.google.common.base.MoreObjects
@@ -28,7 +28,9 @@ import org.apache.james.task.TaskManager.Status._
 
 object TaskExecutionDetails {
 
-  trait AdditionalInformation {}
+  trait AdditionalInformation {
+    def timestamp: Instant
+  }
 
   def from(task: Task, id: TaskId, hostname: Hostname) = new TaskExecutionDetails(id, task.`type`, WAITING, submittedDate = ZonedDateTime.now, submittedNode = hostname, () => task.details)
 }
diff --git a/server/task/task-api/src/test/java/org/apache/james/task/MemoryReferenceWithCounterTask.java b/server/task/task-api/src/test/java/org/apache/james/task/MemoryReferenceWithCounterTask.java
index 819737d..eff246c 100644
--- a/server/task/task-api/src/test/java/org/apache/james/task/MemoryReferenceWithCounterTask.java
+++ b/server/task/task-api/src/test/java/org/apache/james/task/MemoryReferenceWithCounterTask.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.task;
 
+import java.time.Clock;
+import java.time.Instant;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicLong;
@@ -42,9 +44,11 @@ public class MemoryReferenceWithCounterTask implements Task {
 
     public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
         private final long count;
+        private final Instant timestamp;
 
-        public AdditionalInformation(long count) {
+        public AdditionalInformation(long count, Instant timestamp) {
             this.count = count;
+            this.timestamp = timestamp;
         }
 
         public long getCount() {
@@ -52,22 +56,29 @@ public class MemoryReferenceWithCounterTask implements Task {
         }
 
         @Override
+        public Instant timestamp() {
+            return timestamp;
+        }
+
+        @Override
         public boolean equals(Object that) {
             if(that instanceof MemoryReferenceWithCounterTask.AdditionalInformation) {
-                return Objects.equals(this.count, ((AdditionalInformation) that).getCount());
+                return Objects.equals(this.count, ((AdditionalInformation) that).getCount()) &&
+                    Objects.equals(this.timestamp, ((AdditionalInformation) that).timestamp);
             }
             return false;
         }
 
         @Override
         public int hashCode() {
-            return Objects.hashCode(this.count);
+            return Objects.hash(this.count, this.timestamp);
         }
 
         @Override
         public String toString() {
             return MoreObjects.toStringHelper(this)
                 .add("count", count)
+                .add("timestamp", timestamp)
                 .toString();
         }
     }
@@ -95,6 +106,6 @@ public class MemoryReferenceWithCounterTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(new MemoryReferenceWithCounterTask.AdditionalInformation(counter.get()));
+        return Optional.of(new MemoryReferenceWithCounterTask.AdditionalInformation(counter.get(), Clock.systemUTC().instant()));
     }
 }
diff --git a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/TaskEventsSerializationTest.java b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/TaskEventsSerializationTest.java
index e714622..63901b9 100644
--- a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/TaskEventsSerializationTest.java
+++ b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/TaskEventsSerializationTest.java
@@ -21,6 +21,7 @@ package org.apache.james.task.eventsourcing.distributed;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.time.Instant;
 import java.util.List;
 import java.util.stream.Stream;
 
@@ -54,6 +55,7 @@ import net.javacrumbs.jsonunit.assertj.JsonAssertions;
 import scala.Option;
 
 class TaskEventsSerializationTest {
+    private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
     private static final JsonTaskSerializer TASK_SERIALIZER = new JsonTaskSerializer(TestTaskDTOModules.COMPLETED_TASK_MODULE,
         TestTaskDTOModules.MEMORY_REFERENCE_WITH_COUNTER_TASK_MODULE.apply(new MemoryReferenceWithCounterTaskStore()));
     private static final JsonTaskAdditionalInformationsSerializer TASK_ADDITIONNAL_INFORMATION_SERIALIZER = new JsonTaskAdditionalInformationsSerializer(MemoryReferenceWithCounterTaskAdditionalInformationDTO.SERIALIZATION_MODULE);
@@ -63,7 +65,7 @@ class TaskEventsSerializationTest {
     private static final EventId EVENT_ID = EventId.fromSerialized(42);
     private static final Task TASK = new CompletedTask();
     private static final Hostname HOSTNAME = new Hostname("foo");
-    private static final MemoryReferenceWithCounterTask.AdditionalInformation counterAdditionalInformation = new MemoryReferenceWithCounterTask.AdditionalInformation(3);
+    private static final MemoryReferenceWithCounterTask.AdditionalInformation counterAdditionalInformation = new MemoryReferenceWithCounterTask.AdditionalInformation(3, TIMESTAMP);
 
     @ParameterizedTest
     @MethodSource
@@ -95,10 +97,10 @@ class TaskEventsSerializationTest {
             Arguments.of(new Failed(AGGREGATE_ID, EVENT_ID, Option.empty(), Option.empty(), Option.empty()), "{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-failed\"}"),
             Arguments.of(new Failed(AGGREGATE_ID, EVENT_ID, Option.empty(), Option.apply("contextual message"), Option.apply("my exception")), "{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-failed\", \"errorMessage\": \"contextual message\", \"exception\": \"my exception\"}"),
             Arguments.of(new Cancelled(AGGREGATE_ID, EVENT_ID, Option.empty()), "{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-cancelled\"}"),
-            Arguments.of(new Completed(AGGREGATE_ID, EVENT_ID, Task.Result.COMPLETED, Option.apply(counterAdditionalInformation)), "{\"result\":\"COMPLETED\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-completed\",\"additionalInformation\":\"{\\\"type\\\":\\\"memory-reference-task-with-counter\\\",\\\"count\\\":3}\"}"),
-            Arguments.of(new Completed(AGGREGATE_ID, EVENT_ID, Task.Result.PARTIAL, Option.apply(counterAdditionalInformation)), "{\"result\":\"PARTIAL\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-completed\",\"additionalInformation\":\"{\\\"type\\\":\\\"memory-reference-task-with-counter\\\",\\\"count\\\":3}\"}"),
-            Arguments.of(new Failed(AGGREGATE_ID, EVENT_ID, Option.apply(counterAdditionalInformation), Option.empty(), Option.empty()), "{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-failed\",\"additionalInformation\":\"{\\\"type\\\":\\\"memory-reference-task-with-counter\\\",\\\"count\\\":3}\"}"),
-            Arguments.of(new Cancelled(AGGREGATE_ID, EVENT_ID, Option.apply(counterAdditionalInformation)), "{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-cancelled\",\"additionalInformation\":\"{\\\"type\\\":\\\"memory-reference-task-with-counter\\\",\\\"count\\\":3}\"}")
+            Arguments.of(new Completed(AGGREGATE_ID, EVENT_ID, Task.Result.COMPLETED, Option.apply(counterAdditionalInformation)), "{\"result\":\"COMPLETED\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-completed\",\"additionalInformation\":\"{\\\"type\\\":\\\"memory-reference-task-with-counter\\\",\\\"count\\\":3,\\\"timestamp\\\":\\\"2018-11-13T12:00:55Z\\\"}\"}"),
+            Arguments.of(new Completed(AGGREGATE_ID, EVENT_ID, Task.Result.PARTIAL, Option.apply(counterAdditionalInformation)), "{\"result\":\"PARTIAL\",\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-completed\",\"additionalInformation\":\"{\\\"type\\\":\\\"memory-reference-task-with-counter\\\",\\\"count\\\":3,\\\"timestamp\\\":\\\"2018-11-13T12:00:55Z\\\"}\"}"),
+            Arguments.of(new Failed(AGGREGATE_ID, EVENT_ID, Option.apply(counterAdditionalInformation), Option.empty(), Option.empty()), "{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-failed\",\"additionalInformation\":\"{\\\"type\\\":\\\"memory-reference-task-with-counter\\\",\\\"count\\\":3,\\\"timestamp\\\":\\\"2018-11-13T12:00:55Z\\\"}\"}"),
+            Arguments.of(new Cancelled(AGGREGATE_ID, EVENT_ID, Option.apply(counterAdditionalInformation)), "{\"aggregate\":\"2c7f4081-aa30-11e9-bf6c-2d3b9e84aafd\",\"event\":42,\"type\":\"task-manager-cancelled\",\"additionalInformation\":\"{\\\"type\\\":\\\"memory-reference-task-with-counter\\\",\\\"count\\\":3,\\\"timestamp\\\":\\\"2018-11-13T12:00:55Z\\\"}\"}")
         );
     }
 
diff --git a/server/task/task-json/src/main/java/org/apache/james/server/task/json/dto/AdditionalInformationDTO.java b/server/task/task-json/src/main/java/org/apache/james/server/task/json/dto/AdditionalInformationDTO.java
index 548cf1c..e1bdde3 100644
--- a/server/task/task-json/src/main/java/org/apache/james/server/task/json/dto/AdditionalInformationDTO.java
+++ b/server/task/task-json/src/main/java/org/apache/james/server/task/json/dto/AdditionalInformationDTO.java
@@ -18,8 +18,12 @@
  ****************************************************************/
 package org.apache.james.server.task.json.dto;
 
+import java.time.Instant;
+
 import org.apache.james.json.DTO;
 
 public interface AdditionalInformationDTO extends DTO {
     String getType();
+
+    Instant getTimestamp();
 }
diff --git a/server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/MemoryReferenceWithCounterTaskAdditionalInformationDTO.java b/server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/MemoryReferenceWithCounterTaskAdditionalInformationDTO.java
index 011799d..dc78329 100644
--- a/server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/MemoryReferenceWithCounterTaskAdditionalInformationDTO.java
+++ b/server/task/task-json/src/test/java/org/apache/james/server/task/json/dto/MemoryReferenceWithCounterTaskAdditionalInformationDTO.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.server.task.json.dto;
 
+import java.time.Instant;
+
 import org.apache.james.json.DTOModule;
 import org.apache.james.task.MemoryReferenceWithCounterTask;
 
@@ -30,19 +32,23 @@ public class MemoryReferenceWithCounterTaskAdditionalInformationDTO implements A
         DTOModule.forDomainObject(MemoryReferenceWithCounterTask.AdditionalInformation.class)
             .convertToDTO(MemoryReferenceWithCounterTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new MemoryReferenceWithCounterTask.AdditionalInformation(
-                dto.count
+                dto.count, dto.timestamp
             ))
             .toDTOConverter((details, type) -> new MemoryReferenceWithCounterTaskAdditionalInformationDTO(
-                type, details.getCount()))
+                type, details.getCount(), details.timestamp()))
             .typeName(MemoryReferenceWithCounterTask.TYPE.asString())
             .withFactory(AdditionalInformationDTOModule::new);
 
     private final String type;
     private final long count;
+    private final Instant timestamp;
 
-    public MemoryReferenceWithCounterTaskAdditionalInformationDTO(@JsonProperty("type") String type, @JsonProperty("count") long count) {
+    public MemoryReferenceWithCounterTaskAdditionalInformationDTO(@JsonProperty("type") String type,
+                                                                  @JsonProperty("count") long count,
+                                                                  @JsonProperty("timestamp") Instant timestamp) {
         this.type = type;
         this.count = count;
+        this.timestamp = timestamp;
     }
 
     public long getCount() {
@@ -50,6 +56,11 @@ public class MemoryReferenceWithCounterTaskAdditionalInformationDTO implements A
     }
 
     @Override
+    public Instant getTimestamp() {
+        return timestamp;
+    }
+
+    @Override
     public String getType() {
         return type;
     }
diff --git a/server/task/task-memory/src/main/java/org/apache/james/task/MemoryTaskManager.java b/server/task/task-memory/src/main/java/org/apache/james/task/MemoryTaskManager.java
index 64f60e9..752c1e6 100644
--- a/server/task/task-memory/src/main/java/org/apache/james/task/MemoryTaskManager.java
+++ b/server/task/task-memory/src/main/java/org/apache/james/task/MemoryTaskManager.java
@@ -32,7 +32,6 @@ import javax.inject.Inject;
 
 import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
-
 import reactor.core.publisher.Flux;
 import reactor.core.scheduler.Schedulers;
 
diff --git a/server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/EventSourcingTaskManagerTest.java b/server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/EventSourcingTaskManagerTest.java
index 05ef373..edf2d7c 100644
--- a/server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/EventSourcingTaskManagerTest.java
+++ b/server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/EventSourcingTaskManagerTest.java
@@ -48,6 +48,7 @@ class EventSourcingTaskManagerTest implements TaskManagerContract {
         .and().pollDelay(ONE_HUNDRED_MILLISECONDS)
         .await();
 
+
     private static final Hostname HOSTNAME = new Hostname("foo");
     private EventSourcingTaskManager taskManager;
     private EventStore eventStore;
diff --git a/server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/TaskAggregateTest.java b/server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/TaskAggregateTest.java
index 075deda..bb98b26 100644
--- a/server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/TaskAggregateTest.java
+++ b/server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/TaskAggregateTest.java
@@ -21,6 +21,7 @@ package org.apache.james.task.eventsourcing;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
+import java.time.Instant;
 import java.util.Arrays;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -42,6 +43,7 @@ class TaskAggregateTest {
 
     static final Hostname HOSTNAME = Hostname.apply("foo");
     static final TaskAggregateId ID = TaskAggregateId.apply(TaskId.generateTaskId());
+    static final Instant timestamp = Instant.parse("2018-11-13T12:00:55Z");
 
     History buildHistory(Function<EventId, Event>... events) {
         return History.of(
@@ -69,7 +71,7 @@ class TaskAggregateTest {
             eventId -> Created.apply(ID, eventId, new MemoryReferenceWithCounterTask((counter) -> Task.Result.COMPLETED), HOSTNAME)
         );
         TaskAggregate aggregate = TaskAggregate.fromHistory(ID, history);
-        assertThat(aggregate.update(new MemoryReferenceWithCounterTask.AdditionalInformation(3))).isEmpty();
+        assertThat(aggregate.update(new MemoryReferenceWithCounterTask.AdditionalInformation(3, timestamp))).isEmpty();
     }
 
     @Test
@@ -79,8 +81,8 @@ class TaskAggregateTest {
             eventId -> Started.apply(ID, eventId, HOSTNAME)
         );
         TaskAggregate aggregate = TaskAggregate.fromHistory(ID, history);
-        assertThat(aggregate.update(new MemoryReferenceWithCounterTask.AdditionalInformation(3)))
-            .containsExactly(AdditionalInformationUpdated.apply(ID, history.getNextEventId(), new MemoryReferenceWithCounterTask.AdditionalInformation(3)));
+        assertThat(aggregate.update(new MemoryReferenceWithCounterTask.AdditionalInformation(3, timestamp)))
+            .containsExactly(AdditionalInformationUpdated.apply(ID, history.getNextEventId(), new MemoryReferenceWithCounterTask.AdditionalInformation(3, timestamp)));
     }
 
     @Test
@@ -91,8 +93,8 @@ class TaskAggregateTest {
             eventId -> CancelRequested.apply(ID, eventId, HOSTNAME)
         );
         TaskAggregate aggregate = TaskAggregate.fromHistory(ID, history);
-        assertThat(aggregate.update(new MemoryReferenceWithCounterTask.AdditionalInformation(3)))
-            .containsExactly(AdditionalInformationUpdated.apply(ID, history.getNextEventId(), new MemoryReferenceWithCounterTask.AdditionalInformation(3)));
+        assertThat(aggregate.update(new MemoryReferenceWithCounterTask.AdditionalInformation(3, timestamp)))
+            .containsExactly(AdditionalInformationUpdated.apply(ID, history.getNextEventId(), new MemoryReferenceWithCounterTask.AdditionalInformation(3, timestamp)));
     }
 
     @Test
@@ -104,7 +106,7 @@ class TaskAggregateTest {
             eventId -> Completed.apply(ID, eventId, Task.Result.COMPLETED, Option.empty())
         );
         TaskAggregate aggregate = TaskAggregate.fromHistory(ID, history);
-        assertThat(aggregate.update(new MemoryReferenceWithCounterTask.AdditionalInformation(3))).isEmpty();
+        assertThat(aggregate.update(new MemoryReferenceWithCounterTask.AdditionalInformation(3, timestamp))).isEmpty();
     }
 
     @Test
@@ -116,7 +118,7 @@ class TaskAggregateTest {
             eventId -> Failed.apply(ID, eventId, Option.empty(), Option.empty(), Option.empty())
         );
         TaskAggregate aggregate = TaskAggregate.fromHistory(ID, history);
-        assertThat(aggregate.update(new MemoryReferenceWithCounterTask.AdditionalInformation(3))).isEmpty();
+        assertThat(aggregate.update(new MemoryReferenceWithCounterTask.AdditionalInformation(3, timestamp))).isEmpty();
     }
 
     @Test
@@ -128,6 +130,6 @@ class TaskAggregateTest {
             eventId -> Cancelled.apply(ID, eventId, Option.empty())
         );
         TaskAggregate aggregate = TaskAggregate.fromHistory(ID, history);
-        assertThat(aggregate.update(new MemoryReferenceWithCounterTask.AdditionalInformation(3))).isEmpty();
+        assertThat(aggregate.update(new MemoryReferenceWithCounterTask.AdditionalInformation(3, timestamp))).isEmpty();
     }
 }
diff --git a/server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/TaskExecutionDetailsProjectionContract.java b/server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/TaskExecutionDetailsProjectionContract.java
index 04fe89a..0d0fefb 100644
--- a/server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/TaskExecutionDetailsProjectionContract.java
+++ b/server/task/task-memory/src/test/java/org/apache/james/task/eventsourcing/TaskExecutionDetailsProjectionContract.java
@@ -31,7 +31,6 @@ import java.util.List;
 import java.util.Optional;
 
 import org.apache.james.task.TaskExecutionDetails;
-
 import org.junit.jupiter.api.Test;
 
 import scala.collection.JavaConverters;
diff --git a/server/task/task-memory/src/test/scala/org/apache/james/task/TaskExecutionDetailsFixture.scala b/server/task/task-memory/src/test/scala/org/apache/james/task/TaskExecutionDetailsFixture.scala
index 7ba491e..036b6e1 100644
--- a/server/task/task-memory/src/test/scala/org/apache/james/task/TaskExecutionDetailsFixture.scala
+++ b/server/task/task-memory/src/test/scala/org/apache/james/task/TaskExecutionDetailsFixture.scala
@@ -18,7 +18,7 @@
  * ***************************************************************/
 package org.apache.james.task
 
-import java.time.{LocalDateTime, ZoneId, ZonedDateTime}
+import java.time.{Clock, Instant, LocalDateTime, ZoneId, ZonedDateTime}
 import java.util.Optional
 
 import org.apache.james.task.TaskExecutionDetails.AdditionalInformation
@@ -37,10 +37,12 @@ object TaskExecutionDetailsFixture {
   val TASK_EXECUTION_DETAILS_2 = new TaskExecutionDetails(TASK_ID_2, TYPE, TaskManager.Status.COMPLETED, SUBMITTED_DATE, SUBMITTED_NODE, EMPTY_ADDITIONAL_INFORMATION)
   val TASK_EXECUTION_DETAILS_UPDATED = new TaskExecutionDetails(TASK_ID, TYPE, TaskManager.Status.FAILED, SUBMITTED_DATE, SUBMITTED_NODE, EMPTY_ADDITIONAL_INFORMATION)
 
+  val DATE: Instant = Instant.parse("2007-07-03T10:15:30.00Z")
+  val CLOCK: Clock = Clock.fixed(DATE, ZoneId.of("UTC"))
 
-  val ADDITIONAL_INFORMATION: () => Optional[AdditionalInformation] = () => Optional.of(new MemoryReferenceWithCounterTask.AdditionalInformation(5))
+  val ADDITIONAL_INFORMATION: () => Optional[AdditionalInformation] = () => Optional.of(new MemoryReferenceWithCounterTask.AdditionalInformation(5, CLOCK.instant()))
   val TASK_EXECUTION_DETAILS_WITH_ADDITIONAL_INFORMATION = new TaskExecutionDetails(TASK_ID, MemoryReferenceWithCounterTask.TYPE, TaskManager.Status.COMPLETED, SUBMITTED_DATE_2, SUBMITTED_NODE_2, ADDITIONAL_INFORMATION)
 
 }
 
-case class CustomAdditionalInformation(value: String) extends AdditionalInformation
+case class CustomAdditionalInformation(value: String, timestamp: Instant) extends AdditionalInformation


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org