You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2022/11/18 14:59:55 UTC

[syncope] branch master updated: [SYNCOPE-1713] Adding after and before parameter to Audit, Task, Report and Remediation queries (#392)

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

ilgrosso pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/master by this push:
     new c17d1a0a17 [SYNCOPE-1713] Adding after and before parameter to Audit, Task, Report and Remediation queries (#392)
c17d1a0a17 is described below

commit c17d1a0a179a6b7c696b39f1bf429ecdc16725a3
Author: Francesco Chicchiriccò <il...@users.noreply.github.com>
AuthorDate: Fri Nov 18 15:59:50 2022 +0100

    [SYNCOPE-1713] Adding after and before parameter to Audit, Task, Report and Remediation queries (#392)
---
 .../client/console/rest/ReportRestClient.java      |   6 +-
 .../client/console/rest/TaskRestClient.java        |   6 +-
 .../rest/api/beans/AbstractTimeframeQuery.java     | 107 ++++++++++++++++++
 .../common/rest/api/beans/AccessTokenQuery.java    |   1 -
 .../syncope/common/rest/api/beans/AuditQuery.java  |   4 +-
 .../common/rest/api/beans/ExecDeleteQuery.java     | 120 ---------------------
 .../beans/{ExecListQuery.java => ExecQuery.java}   |  10 +-
 .../common/rest/api/beans/RemediationQuery.java    |   4 +-
 .../common/rest/api/service/ExecutableService.java |   7 +-
 .../syncope/core/logic/RemediationLogic.java       |   5 +-
 .../rest/cxf/service/RemediationServiceImpl.java   |   6 +-
 .../core/logic/AbstractExecutableLogic.java        |  13 ++-
 .../org/apache/syncope/core/logic/AuditLogic.java  |   7 +-
 .../org/apache/syncope/core/logic/ReportLogic.java |  33 +++---
 .../org/apache/syncope/core/logic/TaskLogic.java   |  19 ++--
 .../cxf/service/AbstractExecutableService.java     |  15 ++-
 .../core/rest/cxf/service/AuditServiceImpl.java    |   2 +
 .../core/persistence/api/dao/AuditConfDAO.java     |   9 +-
 .../core/persistence/api/dao/RemediationDAO.java   |   8 +-
 .../core/persistence/api/dao/ReportExecDAO.java    |  13 ++-
 .../core/persistence/api/dao/TaskExecDAO.java      |  13 ++-
 .../persistence/jpa/dao/MyJPAJSONAuditConfDAO.java |  18 ++--
 .../persistence/jpa/dao/OJPAJSONAuditConfDAO.java  |  30 +++---
 .../persistence/jpa/dao/PGJPAJSONAuditConfDAO.java |  18 ++--
 .../core/persistence/jpa/dao/JPAAuditConfDAO.java  |  51 ++++++++-
 .../persistence/jpa/dao/JPARemediationDAO.java     |  18 +++-
 .../core/persistence/jpa/dao/JPAReportExecDAO.java | 110 +++++++++----------
 .../core/persistence/jpa/dao/JPATaskExecDAO.java   |  90 +++++++---------
 .../persistence/jpa/inner/RemediationTest.java     |   2 +-
 .../core/persistence/jpa/inner/TaskExecTest.java   |   2 +-
 .../syncope/core/starter/SelfKeymasterContext.java |   8 +-
 .../jpa/dao/ElasticsearchAuditConfDAO.java         |  30 +++++-
 .../org/apache/syncope/fit/core/AuditITCase.java   |  10 +-
 .../syncope/fit/core/PropagationTaskITCase.java    |   7 +-
 .../apache/syncope/fit/core/PullTaskITCase.java    |   4 +-
 .../org/apache/syncope/fit/core/ReportITCase.java  |   4 +-
 .../apache/syncope/fit/core/SchedTaskITCase.java   |   4 +-
 37 files changed, 447 insertions(+), 367 deletions(-)

diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
index a7af135ba0..c189b2dd76 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/ReportRestClient.java
@@ -40,7 +40,7 @@ import org.apache.syncope.common.lib.types.ReportExecExportFormat;
 import org.apache.syncope.common.lib.types.ReportTemplateFormat;
 import org.apache.syncope.common.rest.api.batch.BatchRequestItem;
 import org.apache.syncope.common.rest.api.batch.BatchResponseItem;
-import org.apache.syncope.common.rest.api.beans.ExecListQuery;
+import org.apache.syncope.common.rest.api.beans.ExecQuery;
 import org.apache.syncope.common.rest.api.beans.ExecSpecs;
 import org.apache.syncope.common.rest.api.service.ReportService;
 import org.apache.syncope.common.rest.api.service.ReportTemplateService;
@@ -112,14 +112,14 @@ public class ReportRestClient extends BaseRestClient
     public List<ExecTO> listExecutions(
             final String taskKey, final int page, final int size, final SortParam<String> sort) {
 
-        return getService(ReportService.class).listExecutions(new ExecListQuery.Builder().
+        return getService(ReportService.class).listExecutions(new ExecQuery.Builder().
                 key(taskKey).page(page).size(size).orderBy(toOrderBy(sort)).build()).getResult();
     }
 
     @Override
     public int countExecutions(final String taskKey) {
         return getService(ReportService.class).
-                listExecutions(new ExecListQuery.Builder().key(taskKey).page(1).size(0).build()).getTotalCount();
+                listExecutions(new ExecQuery.Builder().key(taskKey).page(1).size(0).build()).getTotalCount();
     }
 
     @Override
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
index 604954da7e..97caaaba70 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/TaskRestClient.java
@@ -39,7 +39,7 @@ import org.apache.syncope.common.lib.types.JobAction;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.common.rest.api.batch.BatchRequestItem;
 import org.apache.syncope.common.rest.api.batch.BatchResponseItem;
-import org.apache.syncope.common.rest.api.beans.ExecListQuery;
+import org.apache.syncope.common.rest.api.beans.ExecQuery;
 import org.apache.syncope.common.rest.api.beans.ExecSpecs;
 import org.apache.syncope.common.rest.api.beans.TaskQuery;
 import org.apache.syncope.common.rest.api.service.TaskService;
@@ -90,7 +90,7 @@ public class TaskRestClient extends BaseRestClient implements ExecutionRestClien
     @Override
     public int countExecutions(final String taskKey) {
         return getService(TaskService.class).
-                listExecutions(new ExecListQuery.Builder().key(taskKey).page(1).size(0).build()).getTotalCount();
+                listExecutions(new ExecQuery.Builder().key(taskKey).page(1).size(0).build()).getTotalCount();
     }
 
     public static List<PropagationTaskTO> listPropagationTasks(
@@ -176,7 +176,7 @@ public class TaskRestClient extends BaseRestClient implements ExecutionRestClien
             final String taskKey, final int page, final int size, final SortParam<String> sort) {
 
         return getService(TaskService.class).
-                listExecutions(new ExecListQuery.Builder().key(taskKey).page(page).size(size).
+                listExecutions(new ExecQuery.Builder().key(taskKey).page(page).size(size).
                         orderBy(toOrderBy(sort)).build()).getResult();
     }
 
diff --git a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AbstractTimeframeQuery.java b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AbstractTimeframeQuery.java
new file mode 100644
index 0000000000..3e88e4e3d6
--- /dev/null
+++ b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AbstractTimeframeQuery.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.rest.api.beans;
+
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
+import io.swagger.v3.oas.annotations.media.Schema;
+import java.time.OffsetDateTime;
+import javax.ws.rs.QueryParam;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+
+public abstract class AbstractTimeframeQuery extends AbstractQuery {
+
+    private static final long serialVersionUID = -6858655425207486223L;
+
+    protected abstract static class Builder<Q extends AbstractTimeframeQuery, B extends Builder<Q, B>>
+            extends AbstractQuery.Builder<Q, B> {
+
+        @Override
+        protected Q getInstance() {
+            return super.getInstance();
+        }
+
+        @SuppressWarnings("unchecked")
+        public B before(final OffsetDateTime before) {
+            getInstance().setBefore(before);
+            return (B) this;
+        }
+
+        @SuppressWarnings("unchecked")
+        public B after(final OffsetDateTime after) {
+            getInstance().setAfter(after);
+            return (B) this;
+        }
+    }
+
+    private OffsetDateTime before;
+
+    private OffsetDateTime after;
+
+    @Parameter(name = "before", in = ParameterIn.QUERY, schema =
+            @Schema(implementation = OffsetDateTime.class))
+    public OffsetDateTime getBefore() {
+        return before;
+    }
+
+    @QueryParam("before")
+    public void setBefore(final OffsetDateTime before) {
+        this.before = before;
+    }
+
+    @Parameter(name = "after", in = ParameterIn.QUERY, schema =
+            @Schema(implementation = OffsetDateTime.class))
+    public OffsetDateTime getAfter() {
+        return after;
+    }
+
+    @QueryParam("after")
+    public void setAfter(final OffsetDateTime after) {
+        this.after = after;
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        AbstractTimeframeQuery other = (AbstractTimeframeQuery) obj;
+        return new EqualsBuilder().
+                appendSuper(super.equals(obj)).
+                append(before, other.before).
+                append(after, other.after).
+                build();
+    }
+
+    @Override
+    public int hashCode() {
+        return new HashCodeBuilder().
+                appendSuper(super.hashCode()).
+                append(before).
+                append(after).
+                build();
+    }
+}
diff --git a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AccessTokenQuery.java b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AccessTokenQuery.java
index abdea3f897..e7e8ce3bbd 100644
--- a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AccessTokenQuery.java
+++ b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AccessTokenQuery.java
@@ -29,5 +29,4 @@ public class AccessTokenQuery extends AbstractQuery {
             return new AccessTokenQuery();
         }
     }
-
 }
diff --git a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AuditQuery.java b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AuditQuery.java
index f9f9402e4b..bb0852c883 100644
--- a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AuditQuery.java
+++ b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/AuditQuery.java
@@ -27,11 +27,11 @@ import javax.ws.rs.QueryParam;
 import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.rest.api.service.JAXRSService;
 
-public class AuditQuery extends AbstractQuery {
+public class AuditQuery extends AbstractTimeframeQuery {
 
     private static final long serialVersionUID = -2863334226169614417L;
 
-    public static class Builder extends AbstractQuery.Builder<AuditQuery, Builder> {
+    public static class Builder extends AbstractTimeframeQuery.Builder<AuditQuery, Builder> {
 
         @Override
         protected AuditQuery newInstance() {
diff --git a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecDeleteQuery.java b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecDeleteQuery.java
deleted file mode 100644
index a3e6f0eef5..0000000000
--- a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecDeleteQuery.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.rest.api.beans;
-
-import java.io.Serializable;
-import java.time.OffsetDateTime;
-import javax.validation.constraints.NotNull;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.QueryParam;
-
-public class ExecDeleteQuery implements Serializable {
-
-    private static final long serialVersionUID = 3846547401120638351L;
-
-    public static class Builder {
-
-        private final ExecDeleteQuery instance = new ExecDeleteQuery();
-
-        public Builder key(final String key) {
-            instance.setKey(key);
-            return this;
-        }
-
-        public Builder startedBefore(final OffsetDateTime date) {
-            instance.setStartedBefore(date);
-            return this;
-        }
-
-        public Builder startedAfter(final OffsetDateTime date) {
-            instance.setStartedAfter(date);
-            return this;
-        }
-
-        public Builder endedBefore(final OffsetDateTime date) {
-            instance.setEndedBefore(date);
-            return this;
-        }
-
-        public Builder endedAfter(final OffsetDateTime date) {
-            instance.setEndedAfter(date);
-            return this;
-        }
-
-        public ExecDeleteQuery build() {
-            return instance;
-        }
-    }
-
-    private String key;
-
-    private OffsetDateTime startedBefore;
-
-    private OffsetDateTime startedAfter;
-
-    private OffsetDateTime endedBefore;
-
-    private OffsetDateTime endedAfter;
-
-    public String getKey() {
-        return key;
-    }
-
-    @NotNull
-    @PathParam("key")
-    public void setKey(final String key) {
-        this.key = key;
-    }
-
-    public OffsetDateTime getStartedBefore() {
-        return startedBefore;
-    }
-
-    @QueryParam("startedBefore")
-    public void setStartedBefore(final OffsetDateTime startedBefore) {
-        this.startedBefore = startedBefore;
-    }
-
-    public OffsetDateTime getStartedAfter() {
-        return startedAfter;
-    }
-
-    @QueryParam("startedAfter")
-    public void setStartedAfter(final OffsetDateTime startedAfter) {
-        this.startedAfter = startedAfter;
-    }
-
-    public OffsetDateTime getEndedBefore() {
-        return endedBefore;
-    }
-
-    @QueryParam("endedBefore")
-    public void setEndedBefore(final OffsetDateTime endedBefore) {
-        this.endedBefore = endedBefore;
-    }
-
-    public OffsetDateTime getEndedAfter() {
-        return endedAfter;
-    }
-
-    @QueryParam("endedAfter")
-    public void setEndedAfter(final OffsetDateTime endedAfter) {
-        this.endedAfter = endedAfter;
-    }
-}
diff --git a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecListQuery.java b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecQuery.java
similarity index 88%
rename from common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecListQuery.java
rename to common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecQuery.java
index 9176691eae..abf444541d 100644
--- a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecListQuery.java
+++ b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/ExecQuery.java
@@ -23,15 +23,15 @@ import javax.ws.rs.PathParam;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 
-public class ExecListQuery extends AbstractQuery {
+public class ExecQuery extends AbstractTimeframeQuery {
 
     private static final long serialVersionUID = -8792519310029596796L;
 
-    public static class Builder extends AbstractQuery.Builder<ExecListQuery, Builder> {
+    public static class Builder extends AbstractTimeframeQuery.Builder<ExecQuery, Builder> {
 
         @Override
-        protected ExecListQuery newInstance() {
-            return new ExecListQuery();
+        protected ExecQuery newInstance() {
+            return new ExecQuery();
         }
 
         public Builder key(final String key) {
@@ -63,7 +63,7 @@ public class ExecListQuery extends AbstractQuery {
         if (getClass() != obj.getClass()) {
             return false;
         }
-        ExecListQuery other = (ExecListQuery) obj;
+        ExecQuery other = (ExecQuery) obj;
         return new EqualsBuilder().
                 appendSuper(super.equals(obj)).
                 append(key, other.key).
diff --git a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/RemediationQuery.java b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/RemediationQuery.java
index f70858c3eb..d237c49c9f 100644
--- a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/RemediationQuery.java
+++ b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/beans/RemediationQuery.java
@@ -18,11 +18,11 @@
  */
 package org.apache.syncope.common.rest.api.beans;
 
-public class RemediationQuery extends AbstractQuery {
+public class RemediationQuery extends AbstractTimeframeQuery {
 
     private static final long serialVersionUID = 4000880445378096031L;
 
-    public static class Builder extends AbstractQuery.Builder<RemediationQuery, Builder> {
+    public static class Builder extends AbstractTimeframeQuery.Builder<RemediationQuery, Builder> {
 
         @Override
         protected RemediationQuery newInstance() {
diff --git a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ExecutableService.java b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ExecutableService.java
index f242d56e19..7deec908cb 100644
--- a/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ExecutableService.java
+++ b/common/idrepo/rest-api/src/main/java/org/apache/syncope/common/rest/api/service/ExecutableService.java
@@ -39,8 +39,7 @@ import org.apache.syncope.common.lib.to.JobTO;
 import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.types.JobAction;
 import org.apache.syncope.common.rest.api.RESTHeaders;
-import org.apache.syncope.common.rest.api.beans.ExecDeleteQuery;
-import org.apache.syncope.common.rest.api.beans.ExecListQuery;
+import org.apache.syncope.common.rest.api.beans.ExecQuery;
 import org.apache.syncope.common.rest.api.beans.ExecSpecs;
 
 public interface ExecutableService extends JAXRSService {
@@ -54,7 +53,7 @@ public interface ExecutableService extends JAXRSService {
     @GET
     @Path("{key}/executions")
     @Produces({ MediaType.APPLICATION_JSON, RESTHeaders.APPLICATION_YAML, MediaType.APPLICATION_XML })
-    PagedResult<ExecTO> listExecutions(@BeanParam ExecListQuery query);
+    PagedResult<ExecTO> listExecutions(@BeanParam ExecQuery query);
 
     /**
      * Returns the list of recently completed executions, ordered by end date descendent.
@@ -91,7 +90,7 @@ public interface ExecutableService extends JAXRSService {
                     description = "Batch results available, returned as Response entity"))
     @Path("{key}/executions")
     @Produces(RESTHeaders.MULTIPART_MIXED)
-    Response deleteExecutions(@BeanParam ExecDeleteQuery query);
+    Response deleteExecutions(@BeanParam ExecQuery query);
 
     /**
      * Executes the executable matching the given specs.
diff --git a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
index 274a90e670..e366c1f031 100644
--- a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
+++ b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/RemediationLogic.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
+import java.time.OffsetDateTime;
 import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
@@ -73,13 +74,15 @@ public class RemediationLogic extends AbstractLogic<RemediationTO> {
     @PreAuthorize("hasRole('" + IdMEntitlement.REMEDIATION_LIST + "')")
     @Transactional(readOnly = true)
     public Pair<Integer, List<RemediationTO>> list(
+            final OffsetDateTime before,
+            final OffsetDateTime after,
             final int page,
             final int size,
             final List<OrderByClause> orderByClauses) {
 
         int count = remediationDAO.count();
 
-        List<RemediationTO> result = remediationDAO.findAll(page, size, orderByClauses).stream().
+        List<RemediationTO> result = remediationDAO.findAll(before, after, page, size, orderByClauses).stream().
                 map(binder::getRemediationTO).collect(Collectors.toList());
 
         return Pair.of(count, result);
diff --git a/core/idm/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RemediationServiceImpl.java b/core/idm/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RemediationServiceImpl.java
index d226519281..971ac896f8 100644
--- a/core/idm/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RemediationServiceImpl.java
+++ b/core/idm/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/RemediationServiceImpl.java
@@ -63,7 +63,11 @@ public class RemediationServiceImpl extends AbstractService implements Remediati
     @Override
     public PagedResult<RemediationTO> list(final RemediationQuery query) {
         Pair<Integer, List<RemediationTO>> result = logic.list(
-                query.getPage(), query.getSize(), getOrderByClauses(query.getOrderBy()));
+                query.getBefore(),
+                query.getAfter(),
+                query.getPage(),
+                query.getSize(),
+                getOrderByClauses(query.getOrderBy()));
         return buildPagedResult(result.getRight(), query.getPage(), query.getSize(), result.getLeft());
     }
 
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AbstractExecutableLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AbstractExecutableLogic.java
index 406ae4abe0..7f323c0704 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AbstractExecutableLogic.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AbstractExecutableLogic.java
@@ -44,7 +44,12 @@ public abstract class AbstractExecutableLogic<T extends EntityTO> extends Abstra
     public abstract ExecTO execute(String key, OffsetDateTime startAt, boolean dryRun);
 
     public abstract Pair<Integer, List<ExecTO>> listExecutions(
-            String key, int page, int size, List<OrderByClause> orderByClauses);
+            String key,
+            OffsetDateTime before,
+            OffsetDateTime after,
+            int page,
+            int size,
+            List<OrderByClause> orderByClauses);
 
     public abstract List<ExecTO> listRecentExecutions(int max);
 
@@ -52,10 +57,8 @@ public abstract class AbstractExecutableLogic<T extends EntityTO> extends Abstra
 
     public abstract List<BatchResponseItem> deleteExecutions(
             String key,
-            OffsetDateTime startedBefore,
-            OffsetDateTime startedAfter,
-            OffsetDateTime endedBefore,
-            OffsetDateTime endedAfter);
+            OffsetDateTime before,
+            OffsetDateTime after);
 
     public abstract JobTO getJob(String key);
 
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AuditLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AuditLogic.java
index 38d054e81d..98794a55bc 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AuditLogic.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/AuditLogic.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.time.OffsetDateTime;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -272,11 +273,13 @@ public class AuditLogic extends AbstractTransactionalLogic<AuditConfTO> {
             final String subcategory,
             final List<String> events,
             final AuditElements.Result result,
+            final OffsetDateTime before,
+            final OffsetDateTime after,
             final List<OrderByClause> orderBy) {
 
-        int count = auditConfDAO.countEntries(entityKey, type, category, subcategory, events, result);
+        int count = auditConfDAO.countEntries(entityKey, type, category, subcategory, events, result, before, after);
         List<AuditEntry> matching = auditConfDAO.searchEntries(
-                entityKey, page, size, type, category, subcategory, events, result, orderBy);
+                entityKey, page, size, type, category, subcategory, events, result, before, after, orderBy);
         return Pair.of(count, matching);
     }
 
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/ReportLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/ReportLogic.java
index 83565a2bc4..6d97d0abe5 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/ReportLogic.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/ReportLogic.java
@@ -275,7 +275,7 @@ public class ReportLogic extends AbstractExecutableLogic<ReportTO> {
 
         // streaming SAX handler from a compressed byte array stream
         try (ByteArrayInputStream bais = new ByteArrayInputStream(reportExec.getExecResult());
-                ZipInputStream zis = new ZipInputStream(bais)) {
+             ZipInputStream zis = new ZipInputStream(bais)) {
 
             // a single ZipEntry in the ZipInputStream (see ReportJob)
             zis.getNextEntry();
@@ -348,16 +348,19 @@ public class ReportLogic extends AbstractExecutableLogic<ReportTO> {
     @PreAuthorize("hasRole('" + IdRepoEntitlement.REPORT_READ + "')")
     @Override
     public Pair<Integer, List<ExecTO>> listExecutions(
-            final String key, final int page, final int size, final List<OrderByClause> orderByClauses) {
+            final String key,
+            final OffsetDateTime before,
+            final OffsetDateTime after,
+            final int page,
+            final int size,
+            final List<OrderByClause> orderByClauses) {
 
-        Report report = reportDAO.find(key);
-        if (report == null) {
-            throw new NotFoundException("Report " + key);
-        }
+        Report report = Optional.ofNullable(reportDAO.find(key)).
+                orElseThrow(() -> new NotFoundException("Report " + key));
 
-        Integer count = reportExecDAO.count(key);
+        Integer count = reportExecDAO.count(report, before, after);
 
-        List<ExecTO> result = reportExecDAO.findAll(report, page, size, orderByClauses).stream().
+        List<ExecTO> result = reportExecDAO.findAll(report, before, after, page, size, orderByClauses).stream().
                 map(reportExec -> binder.getExecTO(reportExec)).collect(Collectors.toList());
 
         return Pair.of(count, result);
@@ -387,19 +390,15 @@ public class ReportLogic extends AbstractExecutableLogic<ReportTO> {
     @Override
     public List<BatchResponseItem> deleteExecutions(
             final String key,
-            final OffsetDateTime startedBefore,
-            final OffsetDateTime startedAfter,
-            final OffsetDateTime endedBefore,
-            final OffsetDateTime endedAfter) {
+            final OffsetDateTime before,
+            final OffsetDateTime after) {
 
-        Report report = reportDAO.find(key);
-        if (report == null) {
-            throw new NotFoundException("Report " + key);
-        }
+        Report report = Optional.ofNullable(reportDAO.find(key)).
+                orElseThrow(() -> new NotFoundException("Report " + key));
 
         List<BatchResponseItem> batchResponseItems = new ArrayList<>();
 
-        reportExecDAO.findAll(report, startedBefore, startedAfter, endedBefore, endedAfter).forEach(exec -> {
+        reportExecDAO.findAll(report, before, after, -1, -1, List.of()).forEach(exec -> {
             BatchResponseItem item = new BatchResponseItem();
             item.getHeaders().put(RESTHeaders.RESOURCE_KEY, List.of(exec.getKey()));
             batchResponseItems.add(item);
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
index 73b1a2c302..df4838b745 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
@@ -410,7 +410,12 @@ public class TaskLogic extends AbstractExecutableLogic<TaskTO> {
     @PreAuthorize("hasRole('" + IdRepoEntitlement.TASK_READ + "')")
     @Override
     public Pair<Integer, List<ExecTO>> listExecutions(
-            final String key, final int page, final int size, final List<OrderByClause> orderByClauses) {
+            final String key,
+            final OffsetDateTime before,
+            final OffsetDateTime after,
+            final int page,
+            final int size,
+            final List<OrderByClause> orderByClauses) {
 
         Task<?> task = taskDAO.find(key).orElseThrow(() -> new NotFoundException("Task " + key));
 
@@ -418,9 +423,9 @@ public class TaskLogic extends AbstractExecutableLogic<TaskTO> {
             securityChecks(IdRepoEntitlement.TASK_READ, ((MacroTask) task).getRealm().getFullPath());
         }
 
-        Integer count = taskExecDAO.count(task);
+        Integer count = taskExecDAO.count(task, before, after);
 
-        List<ExecTO> result = taskExecDAO.findAll(task, page, size, orderByClauses).stream().
+        List<ExecTO> result = taskExecDAO.findAll(task, before, after, page, size, orderByClauses).stream().
                 map(exec -> binder.getExecTO(exec)).collect(Collectors.toList());
 
         return Pair.of(count, result);
@@ -466,16 +471,14 @@ public class TaskLogic extends AbstractExecutableLogic<TaskTO> {
     @Override
     public List<BatchResponseItem> deleteExecutions(
             final String key,
-            final OffsetDateTime startedBefore,
-            final OffsetDateTime startedAfter,
-            final OffsetDateTime endedBefore,
-            final OffsetDateTime endedAfter) {
+            final OffsetDateTime before,
+            final OffsetDateTime after) {
 
         Task<?> task = taskDAO.find(key).orElseThrow(() -> new NotFoundException("Task " + key));
 
         List<BatchResponseItem> batchResponseItems = new ArrayList<>();
 
-        taskExecDAO.findAll(task, startedBefore, startedAfter, endedBefore, endedAfter).forEach(exec -> {
+        taskExecDAO.findAll(task, before, after, -1, -1, List.of()).forEach(exec -> {
             BatchResponseItem item = new BatchResponseItem();
             item.getHeaders().put(RESTHeaders.RESOURCE_KEY, List.of(exec.getKey()));
             batchResponseItems.add(item);
diff --git a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractExecutableService.java b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractExecutableService.java
index 5a71598fad..03e059b61e 100644
--- a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractExecutableService.java
+++ b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractExecutableService.java
@@ -28,8 +28,7 @@ import org.apache.syncope.common.lib.types.JobAction;
 import org.apache.syncope.common.rest.api.RESTHeaders;
 import org.apache.syncope.common.rest.api.batch.BatchPayloadGenerator;
 import org.apache.syncope.common.rest.api.batch.BatchResponseItem;
-import org.apache.syncope.common.rest.api.beans.ExecDeleteQuery;
-import org.apache.syncope.common.rest.api.beans.ExecListQuery;
+import org.apache.syncope.common.rest.api.beans.ExecQuery;
 import org.apache.syncope.common.rest.api.beans.ExecSpecs;
 import org.apache.syncope.common.rest.api.service.ExecutableService;
 import org.apache.syncope.common.rest.api.service.JAXRSService;
@@ -41,9 +40,11 @@ public abstract class AbstractExecutableService extends AbstractService implemen
     protected abstract AbstractExecutableLogic<?> getExecutableLogic();
 
     @Override
-    public PagedResult<ExecTO> listExecutions(final ExecListQuery query) {
+    public PagedResult<ExecTO> listExecutions(final ExecQuery query) {
         Pair<Integer, List<ExecTO>> result = getExecutableLogic().listExecutions(
                 query.getKey(),
+                query.getBefore(),
+                query.getAfter(),
                 query.getPage(),
                 query.getSize(),
                 getOrderByClauses(query.getOrderBy()));
@@ -61,13 +62,11 @@ public abstract class AbstractExecutableService extends AbstractService implemen
     }
 
     @Override
-    public Response deleteExecutions(final ExecDeleteQuery query) {
+    public Response deleteExecutions(final ExecQuery query) {
         List<BatchResponseItem> batchResponseItems = getExecutableLogic().deleteExecutions(
                 query.getKey(),
-                query.getStartedBefore(),
-                query.getStartedAfter(),
-                query.getEndedBefore(),
-                query.getEndedAfter());
+                query.getBefore(),
+                query.getAfter());
 
         String boundary = "deleteExecutions_" + SecureRandomUtils.generateRandomUUID().toString();
         return Response.ok(BatchPayloadGenerator.generate(
diff --git a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AuditServiceImpl.java b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AuditServiceImpl.java
index d2a382919e..70adf9cd78 100644
--- a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AuditServiceImpl.java
+++ b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AuditServiceImpl.java
@@ -79,6 +79,8 @@ public class AuditServiceImpl extends AbstractService implements AuditService {
                 auditQuery.getSubcategory(),
                 auditQuery.getEvents(),
                 auditQuery.getResult(),
+                auditQuery.getBefore(),
+                auditQuery.getAfter(),
                 getOrderByClauses(auditQuery.getOrderBy()));
 
         return buildPagedResult(result.getRight(), auditQuery.getPage(), auditQuery.getSize(), result.getLeft());
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AuditConfDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AuditConfDAO.java
index 4e060e5499..9e569e71fe 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AuditConfDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AuditConfDAO.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.persistence.api.dao;
 
+import java.time.OffsetDateTime;
 import java.util.List;
 import org.apache.syncope.common.lib.audit.AuditEntry;
 import org.apache.syncope.common.lib.types.AuditElements;
@@ -30,6 +31,8 @@ public interface AuditConfDAO extends DAO<AuditConf> {
 
     String AUDIT_ENTRY_MESSAGE_COLUMN = "MESSAGE";
 
+    String AUDIT_ENTRY_EVENT_DATE_COLUMN = "EVENT_DATE";
+
     AuditConf find(String key);
 
     List<AuditConf> findAll();
@@ -44,7 +47,9 @@ public interface AuditConfDAO extends DAO<AuditConf> {
             String category,
             String subcategory,
             List<String> events,
-            AuditElements.Result result);
+            AuditElements.Result result,
+            OffsetDateTime before,
+            OffsetDateTime after);
 
     List<AuditEntry> searchEntries(
             String entityKey,
@@ -55,5 +60,7 @@ public interface AuditConfDAO extends DAO<AuditConf> {
             String subcategory,
             List<String> events,
             AuditElements.Result result,
+            OffsetDateTime before,
+            OffsetDateTime after,
             List<OrderByClause> orderBy);
 }
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RemediationDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RemediationDAO.java
index 5fd3d49737..62cefea481 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RemediationDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RemediationDAO.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.persistence.api.dao;
 
+import java.time.OffsetDateTime;
 import java.util.List;
 import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
@@ -34,7 +35,12 @@ public interface RemediationDAO extends DAO<Remediation> {
 
     int count();
 
-    List<Remediation> findAll(int page, int itemsPerPage, List<OrderByClause> orderByClauses);
+    List<Remediation> findAll(
+            OffsetDateTime before,
+            OffsetDateTime after,
+            int page,
+            int itemsPerPage,
+            List<OrderByClause> orderByClauses);
 
     Remediation save(Remediation remediation);
 
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ReportExecDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ReportExecDAO.java
index 7fda0cd593..63e3cbf4cc 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ReportExecDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ReportExecDAO.java
@@ -34,16 +34,15 @@ public interface ReportExecDAO extends DAO<ReportExec> {
 
     ReportExec findLatestEnded(Report report);
 
-    int count(String reportKey);
-
-    List<ReportExec> findAll(Report report, int page, int itemsPerPage, List<OrderByClause> orderByClauses);
+    int count(Report report, OffsetDateTime before, OffsetDateTime after);
 
     List<ReportExec> findAll(
             Report report,
-            OffsetDateTime startedBefore,
-            OffsetDateTime startedAfter,
-            OffsetDateTime endedBefore,
-            OffsetDateTime endedAfter);
+            OffsetDateTime before,
+            OffsetDateTime after,
+            int page,
+            int itemsPerPage,
+            List<OrderByClause> orderByClauses);
 
     ReportExec save(ReportExec execution);
 
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/TaskExecDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/TaskExecDAO.java
index 55edbc6c17..5b77e1aa30 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/TaskExecDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/TaskExecDAO.java
@@ -38,16 +38,15 @@ public interface TaskExecDAO extends DAO<TaskExec<?>> {
 
     TaskExec<?> findLatestEnded(TaskType type, Task<?> task);
 
-    int count(Task<?> task);
-
-    List<TaskExec<?>> findAll(Task<?> task, int page, int itemsPerPage, List<OrderByClause> orderByClauses);
+    int count(Task<?> task, OffsetDateTime before, OffsetDateTime after);
 
     List<TaskExec<?>> findAll(
             Task<?> task,
-            OffsetDateTime startedBefore,
-            OffsetDateTime startedAfter,
-            OffsetDateTime endedBefore,
-            OffsetDateTime endedAfter);
+            OffsetDateTime before,
+            OffsetDateTime after,
+            int page,
+            int itemsPerPage,
+            List<OrderByClause> orderByClauses);
 
     <T extends Task<T>> TaskExec<T> save(TaskExec<T> execution);
 
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAuditConfDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAuditConfDAO.java
index 453fc152e1..0de9861b7a 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAuditConfDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAuditConfDAO.java
@@ -30,7 +30,7 @@ public class MyJPAJSONAuditConfDAO extends AbstractJPAJSONLoggerDAO {
         @Override
         protected String doBuild(final List<ObjectNode> containers) {
             if (entityKey != null) {
-                query.append('(').
+                query.append(andIfNeeded()).append('(').
                         append(AUDIT_ENTRY_MESSAGE_COLUMN).append("->'$.before' LIKE '%").append(entityKey).
                         append("%' OR ").
                         append(AUDIT_ENTRY_MESSAGE_COLUMN).append("->'$.input' LIKE '%").append(entityKey).
@@ -40,16 +40,12 @@ public class MyJPAJSONAuditConfDAO extends AbstractJPAJSONLoggerDAO {
             }
 
             if (!containers.isEmpty()) {
-                if (entityKey != null) {
-                    query.append(" AND (");
-                }
-                query.append(containers.stream().
-                        map(container -> "JSON_CONTAINS(" + AUDIT_ENTRY_MESSAGE_COLUMN + ", '"
-                        + POJOHelper.serialize(container).replace("'", "''")
-                        + "')").collect(Collectors.joining(" OR ")));
-                if (entityKey != null) {
-                    query.append(')');
-                }
+                query.append(andIfNeeded()).append('(').
+                        append(containers.stream().
+                                map(container -> "JSON_CONTAINS(" + AUDIT_ENTRY_MESSAGE_COLUMN + ", '"
+                                + POJOHelper.serialize(container).replace("'", "''")
+                                + "')").collect(Collectors.joining(" OR "))).
+                        append(')');
             }
 
             return query.toString();
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/OJPAJSONAuditConfDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/OJPAJSONAuditConfDAO.java
index 6afc9a9ed8..3491c4666c 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/OJPAJSONAuditConfDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/OJPAJSONAuditConfDAO.java
@@ -39,7 +39,7 @@ public class OJPAJSONAuditConfDAO extends AbstractJPAJSONLoggerDAO {
         @Override
         protected String doBuild(final List<ObjectNode> containers) {
             if (entityKey != null) {
-                query.append('(').
+                query.append(andIfNeeded()).append('(').
                         append("JSON_VALUE(").append(AUDIT_ENTRY_MESSAGE_COLUMN).
                         append(", '$.before' RETURNING VARCHAR2(32767)) LIKE '%").
                         append(entityKey).append("%' OR ").
@@ -52,24 +52,20 @@ public class OJPAJSONAuditConfDAO extends AbstractJPAJSONLoggerDAO {
             }
 
             if (!containers.isEmpty()) {
-                if (entityKey != null) {
-                    query.append(" AND (");
-                }
-                query.append(containers.stream().filter(container -> container.has("logger")).map(container -> {
-                    JsonNode logger = container.get("logger");
+                query.append(andIfNeeded()).append('(').
+                        append(containers.stream().filter(container -> container.has("logger")).map(container -> {
+                            JsonNode logger = container.get("logger");
 
-                    List<String> clauses = new ArrayList<>();
-                    jsonExprItem(logger, "type").ifPresent(clauses::add);
-                    jsonExprItem(logger, "category").ifPresent(clauses::add);
-                    jsonExprItem(logger, "subcategory").ifPresent(clauses::add);
-                    jsonExprItem(logger, "result").ifPresent(clauses::add);
-                    jsonExprItem(logger, "event").ifPresent(clauses::add);
+                            List<String> clauses = new ArrayList<>();
+                            jsonExprItem(logger, "type").ifPresent(clauses::add);
+                            jsonExprItem(logger, "category").ifPresent(clauses::add);
+                            jsonExprItem(logger, "subcategory").ifPresent(clauses::add);
+                            jsonExprItem(logger, "result").ifPresent(clauses::add);
+                            jsonExprItem(logger, "event").ifPresent(clauses::add);
 
-                    return "JSON_EXISTS(MESSAGE, '$[*]?(" + String.join(" && ", clauses) + ")')";
-                }).filter(Objects::nonNull).collect(Collectors.joining(" OR ")));
-                if (entityKey != null) {
-                    query.append(')');
-                }
+                            return "JSON_EXISTS(MESSAGE, '$[*]?(" + String.join(" && ", clauses) + ")')";
+                        }).filter(Objects::nonNull).collect(Collectors.joining(" OR "))).
+                        append(')');
             }
 
             return query.toString();
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAuditConfDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAuditConfDAO.java
index c797b7d052..1892017374 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAuditConfDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAuditConfDAO.java
@@ -31,7 +31,7 @@ public class PGJPAJSONAuditConfDAO extends AbstractJPAJSONLoggerDAO {
         @Override
         protected String doBuild(final List<ObjectNode> containers) {
             if (entityKey != null) {
-                query.append('(').
+                query.append(andIfNeeded()).append('(').
                         append(AUDIT_ENTRY_MESSAGE_COLUMN).append(" ->> 'before' LIKE '%").append(entityKey).
                         append("%' OR ").
                         append(AUDIT_ENTRY_MESSAGE_COLUMN).append(" ->> 'input' LIKE '%").append(entityKey).
@@ -41,16 +41,12 @@ public class PGJPAJSONAuditConfDAO extends AbstractJPAJSONLoggerDAO {
             }
 
             if (!containers.isEmpty()) {
-                if (entityKey != null) {
-                    query.append(" AND (");
-                }
-                query.append(containers.stream().
-                        map(container -> AUDIT_ENTRY_MESSAGE_COLUMN + "::jsonb @> '"
-                        + POJOHelper.serialize(container).replace("'", "''")
-                        + "'::jsonb").collect(Collectors.joining(" OR ")));
-                if (entityKey != null) {
-                    query.append(')');
-                }
+                query.append(andIfNeeded()).append('(').
+                        append(containers.stream().
+                                map(container -> AUDIT_ENTRY_MESSAGE_COLUMN + "::jsonb @> '"
+                                + POJOHelper.serialize(container).replace("'", "''")
+                                + "'::jsonb").collect(Collectors.joining(" OR "))).
+                        append(')');
             }
 
             return query.toString();
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAuditConfDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAuditConfDAO.java
index 2f68b4cf2d..ff8430a2c0 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAuditConfDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAuditConfDAO.java
@@ -20,6 +20,8 @@ package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.sql.Clob;
 import java.sql.SQLException;
+import java.time.OffsetDateTime;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -45,6 +47,11 @@ public class JPAAuditConfDAO extends AbstractDAO<AuditConf> implements AuditConf
             return query.length() == 0 ? " " : " AND ";
         }
 
+        protected int setParameter(final List<Object> parameters, final Object parameter) {
+            parameters.add(parameter);
+            return parameters.size();
+        }
+
         protected MessageCriteriaBuilder entityKey(final String entityKey) {
             if (entityKey != null) {
                 query.append(andIfNeeded()).append(AUDIT_ENTRY_MESSAGE_COLUMN).
@@ -96,6 +103,22 @@ public class JPAAuditConfDAO extends AbstractDAO<AuditConf> implements AuditConf
             return this;
         }
 
+        public MessageCriteriaBuilder before(final OffsetDateTime before, final List<Object> parameters) {
+            if (before != null) {
+                query.append(andIfNeeded()).append(AUDIT_ENTRY_EVENT_DATE_COLUMN).
+                        append(" <= ?").append(setParameter(parameters, before));
+            }
+            return this;
+        }
+
+        public MessageCriteriaBuilder after(final OffsetDateTime after, final List<Object> parameters) {
+            if (after != null) {
+                query.append(andIfNeeded()).append(AUDIT_ENTRY_EVENT_DATE_COLUMN).
+                        append(" >= ?").append(setParameter(parameters, after));
+            }
+            return this;
+        }
+
         public String build() {
             return query.toString();
         }
@@ -127,6 +150,16 @@ public class JPAAuditConfDAO extends AbstractDAO<AuditConf> implements AuditConf
         return new MessageCriteriaBuilder().entityKey(entityKey);
     }
 
+    protected void fillWithParameters(final Query query, final List<Object> parameters) {
+        for (int i = 0; i < parameters.size(); i++) {
+            if (parameters.get(i) instanceof Boolean) {
+                query.setParameter(i + 1, ((Boolean) parameters.get(i)) ? 1 : 0);
+            } else {
+                query.setParameter(i + 1, parameters.get(i));
+            }
+        }
+    }
+
     @Override
     public int countEntries(
             final String entityKey,
@@ -134,8 +167,11 @@ public class JPAAuditConfDAO extends AbstractDAO<AuditConf> implements AuditConf
             final String category,
             final String subcategory,
             final List<String> events,
-            final AuditElements.Result result) {
+            final AuditElements.Result result,
+            final OffsetDateTime before,
+            final OffsetDateTime after) {
 
+        List<Object> parameters = new ArrayList<>();
         String queryString = "SELECT COUNT(0)"
                 + " FROM " + AUDIT_ENTRY_TABLE
                 + " WHERE " + messageCriteriaBuilder(entityKey).
@@ -144,10 +180,13 @@ public class JPAAuditConfDAO extends AbstractDAO<AuditConf> implements AuditConf
                         subcategory(subcategory).
                         result(result).
                         events(events).
+                        before(before, parameters).
+                        after(after, parameters).
                         build();
-        Query countQuery = entityManager().createNativeQuery(queryString);
+        Query query = entityManager().createNativeQuery(queryString);
+        fillWithParameters(query, parameters);
 
-        return ((Number) countQuery.getSingleResult()).intValue();
+        return ((Number) query.getSingleResult()).intValue();
     }
 
     protected String select() {
@@ -165,8 +204,11 @@ public class JPAAuditConfDAO extends AbstractDAO<AuditConf> implements AuditConf
             final String subcategory,
             final List<String> events,
             final AuditElements.Result result,
+            final OffsetDateTime before,
+            final OffsetDateTime after,
             final List<OrderByClause> orderBy) {
 
+        List<Object> parameters = new ArrayList<>();
         String queryString = "SELECT " + select()
                 + " FROM " + AUDIT_ENTRY_TABLE
                 + " WHERE " + messageCriteriaBuilder(entityKey).
@@ -175,6 +217,8 @@ public class JPAAuditConfDAO extends AbstractDAO<AuditConf> implements AuditConf
                         subcategory(subcategory).
                         result(result).
                         events(events).
+                        before(before, parameters).
+                        after(after, parameters).
                         build();
         if (!orderBy.isEmpty()) {
             queryString += " ORDER BY " + orderBy.stream().
@@ -183,6 +227,7 @@ public class JPAAuditConfDAO extends AbstractDAO<AuditConf> implements AuditConf
         }
 
         Query query = entityManager().createNativeQuery(queryString);
+        fillWithParameters(query, parameters);
         query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
         if (itemsPerPage >= 0) {
             query.setMaxResults(itemsPerPage);
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java
index 9eb10f6597..dbca9f6073 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARemediationDAO.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.lang.reflect.Field;
+import java.time.OffsetDateTime;
 import java.util.List;
 import javax.persistence.Query;
 import javax.persistence.TypedQuery;
@@ -65,12 +66,20 @@ public class JPARemediationDAO extends AbstractDAO<Remediation> implements Remed
 
     @Override
     public List<Remediation> findAll(
+            final OffsetDateTime before,
+            final OffsetDateTime after,
             final int page,
             final int itemsPerPage,
             final List<OrderByClause> orderByClauses) {
 
         StringBuilder queryString = new StringBuilder(
-                "SELECT e FROM " + JPARemediation.class.getSimpleName() + " e");
+                "SELECT e FROM " + JPARemediation.class.getSimpleName() + " e WHERE 1=1 ");
+        if (before != null) {
+            queryString.append(" AND e.instant <= :before");
+        }
+        if (after != null) {
+            queryString.append(" AND e.instant >= :after");
+        }
 
         if (!orderByClauses.isEmpty()) {
             queryString.append(" ORDER BY ");
@@ -102,7 +111,12 @@ public class JPARemediationDAO extends AbstractDAO<Remediation> implements Remed
         }
 
         TypedQuery<Remediation> query = entityManager().createQuery(queryString.toString(), Remediation.class);
-
+        if (before != null) {
+            query.setParameter("before", before);
+        }
+        if (after != null) {
+            query.setParameter("after", after);
+        }
         query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
 
         if (itemsPerPage > 0) {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAReportExecDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAReportExecDAO.java
index 4d49c67eef..1b4d7ac751 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAReportExecDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAReportExecDAO.java
@@ -47,7 +47,7 @@ public class JPAReportExecDAO extends AbstractDAO<ReportExec> implements ReportE
         return query.getResultList();
     }
 
-    private ReportExec findLatest(final Report report, final String field) {
+    protected ReportExec findLatest(final Report report, final String field) {
         TypedQuery<ReportExec> query = entityManager().createQuery(
                 "SELECT e FROM " + JPAReportExec.class.getSimpleName() + " e "
                 + "WHERE e.report=:report ORDER BY e." + field + " DESC", ReportExec.class);
@@ -70,16 +70,44 @@ public class JPAReportExecDAO extends AbstractDAO<ReportExec> implements ReportE
         return findLatest(report, "end");
     }
 
+    protected StringBuilder query(
+            final StringBuilder select,
+            final OffsetDateTime before,
+            final OffsetDateTime after) {
+
+        StringBuilder query = select.
+                append(JPAReportExec.class.getSimpleName()).
+                append(" e WHERE e.report=:report ");
+        if (before != null) {
+            query.append("AND e.start <= :before ");
+        }
+        if (after != null) {
+            query.append("AND e.start >= :after ");
+        }
+        return query;
+    }
+
     @Override
-    public int count(final String reportKey) {
-        Query countQuery = entityManager().createNativeQuery(
-                "SELECT COUNT(e.id) FROM " + JPAReportExec.TABLE + " e WHERE e.report_id=?1");
-        countQuery.setParameter(1, reportKey);
+    public int count(
+            final Report report,
+            final OffsetDateTime before,
+            final OffsetDateTime after) {
+
+        StringBuilder queryString = query(new StringBuilder("SELECT COUNT(e) FROM "), before, after);
 
-        return ((Number) countQuery.getSingleResult()).intValue();
+        Query query = entityManager().createQuery(queryString.toString());
+        query.setParameter("report", report);
+        if (before != null) {
+            query.setParameter("before", before);
+        }
+        if (after != null) {
+            query.setParameter("after", after);
+        }
+
+        return ((Number) query.getSingleResult()).intValue();
     }
 
-    private static String toOrderByStatement(final List<OrderByClause> orderByClauses) {
+    protected String toOrderByStatement(final List<OrderByClause> orderByClauses) {
         StringBuilder statement = new StringBuilder();
 
         for (OrderByClause clause : orderByClauses) {
@@ -90,23 +118,33 @@ public class JPAReportExecDAO extends AbstractDAO<ReportExec> implements ReportE
         }
 
         if (statement.length() == 0) {
-            statement.append("ORDER BY e.id DESC");
+            statement.append(" ORDER BY e.id DESC");
         } else {
-            statement.insert(0, "ORDER BY ");
+            statement.insert(0, " ORDER BY ");
         }
         return statement.toString();
     }
 
     @Override
-    public List<ReportExec> findAll(final Report report,
-            final int page, final int itemsPerPage, final List<OrderByClause> orderByClauses) {
+    public List<ReportExec> findAll(
+            final Report report,
+            final OffsetDateTime before,
+            final OffsetDateTime after,
+            final int page,
+            final int itemsPerPage,
+            final List<OrderByClause> orderByClauses) {
 
-        String queryString =
-                "SELECT e FROM " + JPAReportExec.class.getSimpleName() + " e WHERE e.report=:report "
-                + toOrderByStatement(orderByClauses);
+        StringBuilder queryString = query(new StringBuilder("SELECT e FROM "), before, after).
+                append(toOrderByStatement(orderByClauses));
 
-        TypedQuery<ReportExec> query = entityManager().createQuery(queryString, ReportExec.class);
+        TypedQuery<ReportExec> query = entityManager().createQuery(queryString.toString(), ReportExec.class);
         query.setParameter("report", report);
+        if (before != null) {
+            query.setParameter("before", before);
+        }
+        if (after != null) {
+            query.setParameter("after", after);
+        }
 
         // page starts from 1, while setFirtResult() starts from 0
         query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
@@ -118,48 +156,6 @@ public class JPAReportExecDAO extends AbstractDAO<ReportExec> implements ReportE
         return query.getResultList();
     }
 
-    @Override
-    public List<ReportExec> findAll(
-            final Report report,
-            final OffsetDateTime startedBefore,
-            final OffsetDateTime startedAfter,
-            final OffsetDateTime endedBefore,
-            final OffsetDateTime endedAfter) {
-
-        StringBuilder queryString = new StringBuilder("SELECT e FROM ").append(JPAReportExec.class.getSimpleName()).
-                append(" e WHERE e.report=:report ");
-
-        if (startedBefore != null) {
-            queryString.append(" AND e.start < :startedBefore");
-        }
-        if (startedAfter != null) {
-            queryString.append(" AND e.start > :startedAfter");
-        }
-        if (endedBefore != null) {
-            queryString.append(" AND e.end < :endedBefore");
-        }
-        if (endedAfter != null) {
-            queryString.append(" AND e.end > :endedAfter");
-        }
-
-        TypedQuery<ReportExec> query = entityManager().createQuery(queryString.toString(), ReportExec.class);
-        query.setParameter("report", report);
-        if (startedBefore != null) {
-            query.setParameter("startedBefore", startedBefore);
-        }
-        if (startedAfter != null) {
-            query.setParameter("startedAfter", startedAfter);
-        }
-        if (endedBefore != null) {
-            query.setParameter("endedBefore", endedBefore);
-        }
-        if (endedAfter != null) {
-            query.setParameter("endedAfter", endedAfter);
-        }
-
-        return query.getResultList();
-    }
-
     @Transactional(rollbackFor = Throwable.class)
     @Override
     public ReportExec save(final ReportExec execution) {
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java
index e6f08ab786..867b979c2f 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskExecDAO.java
@@ -124,59 +124,42 @@ public class JPATaskExecDAO extends AbstractDAO<TaskExec<?>> implements TaskExec
         return findLatest(type, task, "end");
     }
 
-    @SuppressWarnings("unchecked")
-    @Override
-    public List<TaskExec<?>> findAll(
+    protected StringBuilder query(
+            final StringBuilder select,
             final Task<?> task,
-            final OffsetDateTime startedBefore,
-            final OffsetDateTime startedAfter,
-            final OffsetDateTime endedBefore,
-            final OffsetDateTime endedAfter) {
+            final OffsetDateTime before,
+            final OffsetDateTime after) {
 
-        StringBuilder queryString = new StringBuilder("SELECT e FROM ").
+        StringBuilder query = select.
                 append(taskUtilsFactory.getInstance(task).getTaskExecEntity().getSimpleName()).
                 append(" e WHERE e.task=:task ");
-
-        if (startedBefore != null) {
-            queryString.append(" AND e.start < :startedBefore");
-        }
-        if (startedAfter != null) {
-            queryString.append(" AND e.start > :startedAfter");
-        }
-        if (endedBefore != null) {
-            queryString.append(" AND e.end < :endedBefore");
+        if (before != null) {
+            query.append("AND e.start <= :before ");
         }
-        if (endedAfter != null) {
-            queryString.append(" AND e.end > :endedAfter");
+        if (after != null) {
+            query.append("AND e.start >= :after ");
         }
+        return query;
+    }
+
+    @Override
+    public int count(
+            final Task<?> task,
+            final OffsetDateTime before,
+            final OffsetDateTime after) {
+
+        StringBuilder queryString = query(new StringBuilder("SELECT COUNT(e) FROM "), task, before, after);
 
         Query query = entityManager().createQuery(queryString.toString());
         query.setParameter("task", task);
-        if (startedBefore != null) {
-            query.setParameter("startedBefore", startedBefore);
-        }
-        if (startedAfter != null) {
-            query.setParameter("startedAfter", startedAfter);
+        if (before != null) {
+            query.setParameter("before", before);
         }
-        if (endedBefore != null) {
-            query.setParameter("endedBefore", endedBefore);
-        }
-        if (endedAfter != null) {
-            query.setParameter("endedAfter", endedAfter);
+        if (after != null) {
+            query.setParameter("after", after);
         }
 
-        List<Object> result = query.getResultList();
-        return result.stream().map(e -> (TaskExec<?>) e).collect(Collectors.toList());
-    }
-
-    @Override
-    public int count(final Task<?> task) {
-        Query countQuery = entityManager().createNativeQuery(
-                "SELECT COUNT(e.id) FROM " + taskUtilsFactory.getInstance(task).getTaskExecTable() + " e "
-                + "WHERE e.task_id=?1");
-        countQuery.setParameter(1, task.getKey());
-
-        return ((Number) countQuery.getSingleResult()).intValue();
+        return ((Number) query.getSingleResult()).intValue();
     }
 
     protected String toOrderByStatement(final List<OrderByClause> orderByClauses) {
@@ -190,9 +173,9 @@ public class JPATaskExecDAO extends AbstractDAO<TaskExec<?>> implements TaskExec
         });
 
         if (statement.length() == 0) {
-            statement.append("ORDER BY e.id DESC");
+            statement.append(" ORDER BY e.id DESC");
         } else {
-            statement.insert(0, "ORDER BY ");
+            statement.insert(0, " ORDER BY ");
         }
         return statement.toString();
     }
@@ -200,15 +183,24 @@ public class JPATaskExecDAO extends AbstractDAO<TaskExec<?>> implements TaskExec
     @SuppressWarnings("unchecked")
     @Override
     public List<TaskExec<?>> findAll(
-            final Task<?> task, final int page, final int itemsPerPage, final List<OrderByClause> orderByClauses) {
+            final Task<?> task,
+            final OffsetDateTime before,
+            final OffsetDateTime after,
+            final int page,
+            final int itemsPerPage,
+            final List<OrderByClause> orderByClauses) {
 
-        String queryString = "SELECT e "
-                + "FROM " + taskUtilsFactory.getInstance(task).getTaskExecEntity().getSimpleName() + " e "
-                + "WHERE e.task=:task "
-                + toOrderByStatement(orderByClauses);
+        StringBuilder queryString = query(new StringBuilder("SELECT e FROM "), task, before, after).
+                append(toOrderByStatement(orderByClauses));
 
-        Query query = entityManager().createQuery(queryString);
+        Query query = entityManager().createQuery(queryString.toString());
         query.setParameter("task", task);
+        if (before != null) {
+            query.setParameter("before", before);
+        }
+        if (after != null) {
+            query.setParameter("after", after);
+        }
 
         // page starts from 1, while setFirtResult() starts from 0
         query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1));
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RemediationTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RemediationTest.java
index fef219960e..8199d16df0 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RemediationTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RemediationTest.java
@@ -56,7 +56,7 @@ public class RemediationTest extends AbstractTest {
 
     @Test
     public void findAll() {
-        List<Remediation> remediations = remediationDAO.findAll(1, 1, List.of());
+        List<Remediation> remediations = remediationDAO.findAll(null, null, 1, 1, List.of());
         assertTrue(remediations.isEmpty());
     }
 
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskExecTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskExecTest.java
index 2474fd01ce..43e7bcbbee 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskExecTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/TaskExecTest.java
@@ -55,7 +55,7 @@ public class TaskExecTest extends AbstractTest {
 
         OffsetDateTime startedBefore = OffsetDateTime.of(2015, 12, 18, 0, 0, 0, 0, FormatUtils.DEFAULT_OFFSET);
 
-        List<TaskExec<?>> execs = taskExecDAO.findAll(task, startedBefore, null, null, null);
+        List<TaskExec<?>> execs = taskExecDAO.findAll(task, startedBefore, null, -1, -1, List.of());
         assertNotNull(execs);
         assertEquals(1, execs.size());
     }
diff --git a/core/self-keymaster-starter/src/main/java/org/apache/syncope/core/starter/SelfKeymasterContext.java b/core/self-keymaster-starter/src/main/java/org/apache/syncope/core/starter/SelfKeymasterContext.java
index 7bfabca130..557b68cfe0 100644
--- a/core/self-keymaster-starter/src/main/java/org/apache/syncope/core/starter/SelfKeymasterContext.java
+++ b/core/self-keymaster-starter/src/main/java/org/apache/syncope/core/starter/SelfKeymasterContext.java
@@ -93,9 +93,11 @@ public class SelfKeymasterContext {
 
     @Conditional(SelfKeymasterCondition.class)
     @Bean
-    public Server selfKeymasterContainer(final JacksonJsonProvider jsonProvider,
-                                         final ApplicationContext ctx,
-                                         final Bus bus) {
+    public Server selfKeymasterContainer(
+            final JacksonJsonProvider jsonProvider,
+            final ApplicationContext ctx,
+            final Bus bus) {
+
         SpringJAXRSServerFactoryBean selfKeymasterContainer = new SpringJAXRSServerFactoryBean();
         selfKeymasterContainer.setBus(bus);
         selfKeymasterContainer.setAddress("/keymaster");
diff --git a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAuditConfDAO.java b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAuditConfDAO.java
index 4746205ae2..bbe3a8537a 100644
--- a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAuditConfDAO.java
+++ b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAuditConfDAO.java
@@ -28,7 +28,9 @@ import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
 import co.elastic.clients.elasticsearch.core.CountRequest;
 import co.elastic.clients.elasticsearch.core.SearchRequest;
 import co.elastic.clients.elasticsearch.core.search.Hit;
+import co.elastic.clients.json.JsonData;
 import java.io.IOException;
+import java.time.OffsetDateTime;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -60,7 +62,9 @@ public class ElasticsearchAuditConfDAO extends JPAAuditConfDAO {
             final String category,
             final String subcategory,
             final List<String> events,
-            final AuditElements.Result result) {
+            final AuditElements.Result result,
+            final OffsetDateTime before,
+            final OffsetDateTime after) {
 
         List<Query> queries = new ArrayList<>();
 
@@ -103,6 +107,20 @@ public class ElasticsearchAuditConfDAO extends JPAAuditConfDAO {
                     build());
         }
 
+        if (before != null) {
+            queries.add(new Query.Builder().
+                    range(QueryBuilders.range().
+                            field("instant").lte(JsonData.of(before.toInstant().toEpochMilli())).build()).
+                    build());
+        }
+
+        if (after != null) {
+            queries.add(new Query.Builder().
+                    range(QueryBuilders.range().
+                            field("instant").gte(JsonData.of(after.toInstant().toEpochMilli())).build()).
+                    build());
+        }
+
         return new Query.Builder().bool(QueryBuilders.bool().must(queries).build()).build();
     }
 
@@ -113,11 +131,13 @@ public class ElasticsearchAuditConfDAO extends JPAAuditConfDAO {
             final String category,
             final String subcategory,
             final List<String> events,
-            final AuditElements.Result result) {
+            final AuditElements.Result result,
+            final OffsetDateTime before,
+            final OffsetDateTime after) {
 
         CountRequest request = new CountRequest.Builder().
                 index(ElasticsearchUtils.getAuditIndex(AuthContextUtils.getDomain())).
-                query(getQuery(entityKey, type, category, subcategory, events, result)).
+                query(getQuery(entityKey, type, category, subcategory, events, result, before, after)).
                 build();
         try {
             return (int) client.count(request).count();
@@ -154,12 +174,14 @@ public class ElasticsearchAuditConfDAO extends JPAAuditConfDAO {
             final String subcategory,
             final List<String> events,
             final AuditElements.Result result,
+            final OffsetDateTime before,
+            final OffsetDateTime after,
             final List<OrderByClause> orderBy) {
 
         SearchRequest request = new SearchRequest.Builder().
                 index(ElasticsearchUtils.getAuditIndex(AuthContextUtils.getDomain())).
                 searchType(SearchType.QueryThenFetch).
-                query(getQuery(entityKey, type, category, subcategory, events, result)).
+                query(getQuery(entityKey, type, category, subcategory, events, result, before, after)).
                 from(itemsPerPage * (page <= 0 ? 0 : page - 1)).
                 size(itemsPerPage < 0 ? indexMaxResultWindow : itemsPerPage).
                 sort(sortBuilders(orderBy)).
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java
index 27b9e07771..c1ad22e173 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuditITCase.java
@@ -127,8 +127,13 @@ public class AuditITCase extends AbstractITCase {
         UserTO userTO = createUser(UserITCase.getUniqueSample("audit@syncope.org")).getEntity();
         assertNotNull(userTO.getKey());
 
-        AuditQuery query = new AuditQuery.Builder().entityKey(userTO.getKey()).orderBy("event_date desc").
-                page(1).size(1).build();
+        AuditQuery query = new AuditQuery.Builder().
+                entityKey(userTO.getKey()).
+                before(OffsetDateTime.now().plusSeconds(30)).
+                page(1).
+                size(1).
+                orderBy("event_date desc").
+                build();
         AuditEntry entry = queryWithFailure(query, MAX_WAIT_SECONDS);
         assertNotNull(entry);
         USER_SERVICE.delete(userTO.getKey());
@@ -148,6 +153,7 @@ public class AuditITCase extends AbstractITCase {
                 category(UserLogic.class.getSimpleName()).
                 event("create").
                 result(AuditElements.Result.SUCCESS).
+                after(OffsetDateTime.now().minusSeconds(30)).
                 build();
         AuditEntry entry = queryWithFailure(query, MAX_WAIT_SECONDS);
         assertNotNull(entry);
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
index e94150f692..4210840e1d 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
@@ -91,7 +91,7 @@ import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.common.rest.api.RESTHeaders;
-import org.apache.syncope.common.rest.api.beans.ExecListQuery;
+import org.apache.syncope.common.rest.api.beans.ExecQuery;
 import org.apache.syncope.common.rest.api.beans.ExecSpecs;
 import org.apache.syncope.common.rest.api.beans.ReconQuery;
 import org.apache.syncope.common.rest.api.beans.TaskQuery;
@@ -605,8 +605,9 @@ public class PropagationTaskITCase extends AbstractTaskITCase {
         assertFalse(task.getExecutions().isEmpty());
 
         // check list executions
-        PagedResult<ExecTO> execs = TASK_SERVICE.listExecutions(new ExecListQuery.Builder().key(
-                "1e697572-b896-484c-ae7f-0c8f63fcbc6c").
+        PagedResult<ExecTO> execs = TASK_SERVICE.listExecutions(new ExecQuery.Builder().
+                key("1e697572-b896-484c-ae7f-0c8f63fcbc6c").
+                before(OffsetDateTime.now().plusSeconds(30)).
                 page(1).size(2).build());
         assertTrue(execs.getTotalCount() >= execs.getResult().size());
     }
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
index 98aef995e4..46c17e39b5 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
@@ -34,6 +34,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
+import java.time.OffsetDateTime;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
@@ -859,7 +860,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
                 assertEquals(ClientExceptionType.Reconciliation, sce.getType());
             }
             Optional<RemediationTO> remediation = REMEDIATION_SERVICE.list(
-                    new RemediationQuery.Builder().page(1).size(1000).build()).getResult().stream().
+                    new RemediationQuery.Builder().after(OffsetDateTime.now().minusSeconds(30)).
+                            page(1).size(1000).build()).getResult().stream().
                     filter(r -> "uid=pullFromLDAP,ou=People,o=isp".equalsIgnoreCase(r.getRemoteName())).
                     findFirst();
             assertTrue(remediation.isPresent());
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java
index 12a7f66611..0e359c9e89 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ReportITCase.java
@@ -52,7 +52,7 @@ import org.apache.syncope.common.lib.types.ReportExecExportFormat;
 import org.apache.syncope.common.lib.types.ReportExecStatus;
 import org.apache.syncope.common.rest.api.RESTHeaders;
 import org.apache.syncope.common.rest.api.batch.BatchResponseItem;
-import org.apache.syncope.common.rest.api.beans.ExecDeleteQuery;
+import org.apache.syncope.common.rest.api.beans.ExecQuery;
 import org.apache.syncope.common.rest.api.beans.ExecSpecs;
 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
 import org.apache.syncope.fit.AbstractITCase;
@@ -284,7 +284,7 @@ public class ReportITCase extends AbstractITCase {
         OffsetDateTime end = OffsetDateTime.now();
 
         Response response = REPORT_SERVICE.deleteExecutions(
-                new ExecDeleteQuery.Builder().key(reportTO.getKey()).startedAfter(start).endedBefore(end).build());
+                new ExecQuery.Builder().key(reportTO.getKey()).after(start).before(end).build());
         List<BatchResponseItem> batchResponseItems = parseBatchResponse(response);
         assertEquals(1, batchResponseItems.size());
         assertEquals(execKey, batchResponseItems.get(0).getHeaders().get(RESTHeaders.RESOURCE_KEY).get(0));
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
index c8964780c7..8ed3ff73e4 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
@@ -44,7 +44,7 @@ import org.apache.syncope.common.lib.to.TaskTO;
 import org.apache.syncope.common.lib.types.IdRepoImplementationType;
 import org.apache.syncope.common.lib.types.JobAction;
 import org.apache.syncope.common.lib.types.TaskType;
-import org.apache.syncope.common.rest.api.beans.ExecListQuery;
+import org.apache.syncope.common.rest.api.beans.ExecQuery;
 import org.apache.syncope.common.rest.api.beans.ExecSpecs;
 import org.apache.syncope.common.rest.api.beans.TaskQuery;
 import org.apache.syncope.common.rest.api.service.TaskService;
@@ -123,7 +123,7 @@ public class SchedTaskITCase extends AbstractTaskITCase {
         });
 
         PagedResult<ExecTO> execs =
-                TASK_SERVICE.listExecutions(new ExecListQuery.Builder().key(task.getKey()).build());
+                TASK_SERVICE.listExecutions(new ExecQuery.Builder().key(task.getKey()).build());
         assertEquals(1, execs.getTotalCount());
         assertTrue(execs.getResult().get(0).getStart().isAfter(initial));
         // round 1 sec for safety