diff --git a/src/main/java/com/inteligr8/activiti/ActivitiPublicRestApi.java b/src/main/java/com/inteligr8/activiti/ActivitiPublicRestApi.java
new file mode 100644
index 0000000..00c0b7c
--- /dev/null
+++ b/src/main/java/com/inteligr8/activiti/ActivitiPublicRestApi.java
@@ -0,0 +1,33 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+package com.inteligr8.activiti;
+
+import com.inteligr8.activiti.api.ManagementApi;
+
+/**
+ * This interface consolidates the JAX-RS APIs available in the open-source
+ * Activiti Public ReST API.
+ * 
+ * @author brian@inteligr8.com
+ */
+public interface ActivitiPublicRestApi {
+	
+	<T> T getApi(Class<T> apiClass);
+	
+	default ManagementApi getManagementApi() {
+		return this.getApi(ManagementApi.class);
+	}
+    
+}
diff --git a/src/main/java/com/inteligr8/activiti/api/ManagementApi.java b/src/main/java/com/inteligr8/activiti/api/ManagementApi.java
new file mode 100644
index 0000000..4ce3e80
--- /dev/null
+++ b/src/main/java/com/inteligr8/activiti/api/ManagementApi.java
@@ -0,0 +1,173 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+package com.inteligr8.activiti.api;
+
+import java.io.File;
+import java.time.LocalDate;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.inteligr8.activiti.model.Engine;
+import com.inteligr8.activiti.model.EngineProperties;
+import com.inteligr8.activiti.model.ExecuteAction;
+import com.inteligr8.activiti.model.ExecuteAction.Action;
+import com.inteligr8.activiti.model.Job;
+import com.inteligr8.activiti.model.ResultList;
+
+@Path("/api/management")
+public interface ManagementApi {
+    
+    public enum JobType {
+        @JsonProperty("jobs")
+        Job,
+        @JsonProperty("deadletter-jobs")
+        DeadletterJob
+    }
+
+    @GET
+    @Path("engine")
+    @Produces({ "application/json" })
+    public Engine getEngine();
+
+    @GET
+    @Path("properties")
+    @Produces({ "application/json" })
+    public EngineProperties getEngineProperties();
+    
+    @GET
+    @Path("{jobType}/{jobId}")
+    @Produces({ "application/json" })
+    public Job getJob(
+            @PathParam("jobType") JobType jobType,
+            @PathParam("jobId") String jobId);
+    
+    @DELETE
+    @Path("{jobType}/{jobId}")
+    public void deleteJob(
+            @PathParam("jobType") JobType jobType,
+            @PathParam("jobId") String jobId);
+    
+    @POST
+    @Path("{jobType}/{jobId}")
+    @Consumes({ "application/json" })
+    public void executeJob(
+            @PathParam("jobType") JobType jobType,
+            @PathParam("jobId") String jobId,
+            ExecuteAction execute);
+    
+    default void executeJob(
+            JobType jobType,
+            String jobId,
+            Action action) {
+        this.executeJob(jobType, jobId, new ExecuteAction(action));
+    }
+    
+    default void executeJob(
+            JobType jobType,
+            String jobId) {
+        this.executeJob(jobType, jobId, new ExecuteAction(Action.Execute));
+    }
+    
+    @GET
+    @Path("{jobType}/{jobId}/execution-stacktrace")
+    @Produces({ "application/octet-stream" })
+    public File getJobStacktrace(
+            @PathParam("jobType") JobType jobType,
+            @PathParam("jobId") String jobId);
+    
+    @GET
+    @Path("{jobType}")
+    @Produces({ "application/json" })
+    public ResultList<Job> queryJobs(
+            @PathParam("jobType") JobType jobType,
+            @QueryParam("id") String jobId,
+            @QueryParam("processInstanceId") String processInstanceId,
+            @QueryParam("executionId") String executionId,
+            @QueryParam("processDefinitionId") String processDefinitionId,
+            @QueryParam("withRetriesLeft") Boolean withRetriesLeft,
+            @QueryParam("executable") Boolean executable,
+            @QueryParam("timersOnly") Boolean timersOnly,
+            @QueryParam("messagesOnly") Boolean messagesOnly,
+            @QueryParam("withException") Boolean withException,
+            @QueryParam("dueBefore") LocalDate dueBefore,
+            @QueryParam("dueAfter") LocalDate dueAfter,
+            @QueryParam("exceptionMessage") String exceptionMessage,
+            @QueryParam("withoutTenantId") Boolean withoutTenatId,
+            @QueryParam("sort") String sort);
+    
+    @GET
+    @Path("{jobType}")
+    @Produces({ "application/json" })
+    public ResultList<Job> queryJobs(
+            @PathParam("jobType") JobType jobType,
+            @QueryParam("id") String jobId,
+            @QueryParam("processInstanceId") String processInstanceId,
+            @QueryParam("executionId") String executionId,
+            @QueryParam("processDefinitionId") String processDefinitionId,
+            @QueryParam("withRetriesLeft") Boolean withRetriesLeft,
+            @QueryParam("executable") Boolean executable,
+            @QueryParam("timersOnly") Boolean timersOnly,
+            @QueryParam("messagesOnly") Boolean messagesOnly,
+            @QueryParam("withException") Boolean withException,
+            @QueryParam("dueBefore") LocalDate dueBefore,
+            @QueryParam("dueAfter") LocalDate dueAfter,
+            @QueryParam("exceptionMessage") String exceptionMessage,
+            @QueryParam("tenantId") String tenantId,
+            @QueryParam("tenantIdLike") String tenantIdLike,
+            @QueryParam("sort") String sort);
+
+    default ResultList<Job> queryTimerJobs(
+            JobType jobType,
+            @QueryParam("id") String jobId,
+            @QueryParam("processInstanceId") String processInstanceId,
+            @QueryParam("executionId") String executionId,
+            @QueryParam("processDefinitionId") String processDefinitionId,
+            @QueryParam("withRetriesLeft") Boolean withRetriesLeft,
+            @QueryParam("executable") Boolean executable,
+            @QueryParam("withException") Boolean withException,
+            @QueryParam("dueBefore") LocalDate dueBefore,
+            @QueryParam("dueAfter") LocalDate dueAfter,
+            @QueryParam("exceptionMessage") String exceptionMessage,
+            @QueryParam("withoutTenantId") Boolean withoutTenantId,
+            @QueryParam("sort") String sort) {
+        return this.queryJobs(jobType, jobId, processInstanceId, executionId, processDefinitionId, withRetriesLeft, executable, true, false, withException, dueBefore, dueAfter, exceptionMessage, withoutTenantId, sort);
+    }
+    
+    default ResultList<Job> queryMessagesJobs(
+            JobType jobType,
+            @QueryParam("id") String jobId,
+            @QueryParam("processInstanceId") String processInstanceId,
+            @QueryParam("executionId") String executionId,
+            @QueryParam("processDefinitionId") String processDefinitionId,
+            @QueryParam("withRetriesLeft") Boolean withRetriesLeft,
+            @QueryParam("executable") Boolean executable,
+            @QueryParam("withException") Boolean withException,
+            @QueryParam("dueBefore") LocalDate dueBefore,
+            @QueryParam("dueAfter") LocalDate dueAfter,
+            @QueryParam("exceptionMessage") String exceptionMessage,
+            @QueryParam("withoutTenantId") Boolean withoutTenantId,
+            @QueryParam("sort") String sort) {
+        return this.queryJobs(jobType, jobId, processInstanceId, executionId, processDefinitionId, withRetriesLeft, executable, false, true, withException, dueBefore, dueAfter, exceptionMessage, withoutTenantId, sort);
+    }
+
+}
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/Datum.java b/src/main/java/com/inteligr8/activiti/model/Datum.java
similarity index 86%
rename from src/main/java/com/inteligr8/alfresco/activiti/model/Datum.java
rename to src/main/java/com/inteligr8/activiti/model/Datum.java
index 477caf6..89eb1bc 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/model/Datum.java
+++ b/src/main/java/com/inteligr8/activiti/model/Datum.java
@@ -1,18 +1,15 @@
 
-package com.inteligr8.alfresco.activiti.model;
+package com.inteligr8.activiti.model;
 
 import java.util.HashMap;
 import java.util.Map;
+
 import com.fasterxml.jackson.annotation.JsonAnyGetter;
 import com.fasterxml.jackson.annotation.JsonAnySetter;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonPropertyOrder;
 
 @JsonInclude(JsonInclude.Include.NON_NULL)
-@JsonPropertyOrder({
-
-})
 public class Datum {
 
     @JsonIgnore
diff --git a/src/main/java/com/inteligr8/activiti/model/Engine.java b/src/main/java/com/inteligr8/activiti/model/Engine.java
new file mode 100644
index 0000000..fe2abf4
--- /dev/null
+++ b/src/main/java/com/inteligr8/activiti/model/Engine.java
@@ -0,0 +1,76 @@
+package com.inteligr8.activiti.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class Engine {
+
+    @JsonProperty("name")
+    private String name;
+    @JsonProperty("version")
+    private String version;
+    @JsonProperty("resourceUrl")
+    private String resourceUrl;
+    @JsonProperty("exception")
+    private String exception;
+
+    /**
+     * No args constructor for use in serialization
+     */
+    public Engine() {
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+	public Engine withName(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+	public Engine withVersion(String version) {
+        this.version = version;
+        return this;
+    }
+
+    public String getResourceUrl() {
+        return resourceUrl;
+    }
+
+    public void setResourceUrl(String resourceUrl) {
+        this.resourceUrl = resourceUrl;
+    }
+
+	public Engine withResourceUrl(String resourceUrl) {
+        this.resourceUrl = resourceUrl;
+        return this;
+    }
+
+    public String getException() {
+        return exception;
+    }
+
+    public void setException(String exception) {
+        this.exception = exception;
+    }
+
+	public Engine withException(String exception) {
+        this.exception = exception;
+        return this;
+    }
+
+}
diff --git a/src/main/java/com/inteligr8/activiti/model/EngineProperties.java b/src/main/java/com/inteligr8/activiti/model/EngineProperties.java
new file mode 100644
index 0000000..6b9c95a
--- /dev/null
+++ b/src/main/java/com/inteligr8/activiti/model/EngineProperties.java
@@ -0,0 +1,61 @@
+package com.inteligr8.activiti.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class EngineProperties {
+
+    @JsonProperty("next.dbid")
+    private String nextDbid;
+    @JsonProperty("schema.history")
+    private String schemaHistory;
+    @JsonProperty("schema.version")
+    private String schemaVersion;
+
+    /**
+     * No args constructor for use in serialization
+     */
+    public EngineProperties() {
+    }
+
+    public String getNextDbid() {
+        return nextDbid;
+    }
+
+    public void setNextDbid(String nextDbid) {
+        this.nextDbid = nextDbid;
+    }
+
+	public EngineProperties withNextDbid(String nextDbid) {
+        this.nextDbid = nextDbid;
+        return this;
+    }
+
+    public String getSchemaHistory() {
+        return schemaHistory;
+    }
+
+    public void setSchemaHistory(String schemaHistory) {
+        this.schemaHistory = schemaHistory;
+    }
+
+	public EngineProperties withSchemaHistory(String schemaHistory) {
+        this.schemaHistory = schemaHistory;
+        return this;
+    }
+
+    public String getSchemaVersion() {
+        return schemaVersion;
+    }
+
+    public void setSchemaVersion(String schemaVersion) {
+        this.schemaVersion = schemaVersion;
+    }
+
+	public EngineProperties withSchemaVersion(String schemaVersion) {
+        this.schemaVersion = schemaVersion;
+        return this;
+    }
+
+}
diff --git a/src/main/java/com/inteligr8/activiti/model/ExecuteAction.java b/src/main/java/com/inteligr8/activiti/model/ExecuteAction.java
new file mode 100644
index 0000000..9c50b41
--- /dev/null
+++ b/src/main/java/com/inteligr8/activiti/model/ExecuteAction.java
@@ -0,0 +1,40 @@
+package com.inteligr8.activiti.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class ExecuteAction {
+
+    public enum Action {
+        @JsonProperty("execute")
+        Execute
+    }
+    
+    @JsonProperty("action")
+    private Action action;
+
+    /**
+     * No args constructor for use in serialization
+     */
+    public ExecuteAction() {
+    }
+    
+    public ExecuteAction(Action action) {
+        this.action = action;
+    }
+
+    public Action getAction() {
+        return action;
+    }
+
+    public void setAction(Action action) {
+        this.action = action;
+    }
+
+	public ExecuteAction withAction(Action action) {
+        this.action = action;
+        return this;
+    }
+
+}
diff --git a/src/main/java/com/inteligr8/activiti/model/Job.java b/src/main/java/com/inteligr8/activiti/model/Job.java
new file mode 100644
index 0000000..8414439
--- /dev/null
+++ b/src/main/java/com/inteligr8/activiti/model/Job.java
@@ -0,0 +1,189 @@
+
+package com.inteligr8.activiti.model;
+
+import java.time.OffsetDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonFormat.Shape;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class Job extends Datum {
+
+    @JsonProperty("id")
+    private String id;
+    @JsonProperty("processInstanceId")
+    private String processInstanceId;
+    @JsonProperty("processInstanceUrl")
+    private String processInstanceUrl;
+    @JsonProperty("processDefinitionId")
+    private String processDefinitionId;
+    @JsonProperty("processDefinitionUrl")
+    private String processDefinitionUrl;
+    @JsonProperty("executionId")
+    private String executionId;
+    @JsonProperty("executionUrl")
+    private String executionUrl;
+    @JsonProperty("retries")
+    private int retries;
+    @JsonProperty("exceptionMessage")
+    private String exceptionMessage;
+    @JsonProperty("dueDate")
+    private OffsetDateTime dueDate;
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    @JsonProperty("tenantId")
+    private String tenantId;
+
+    /**
+     * No args constructor for use in serialization
+     */
+    public Job() {
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+	public Job withId(String id) {
+        this.id = id;
+        return this;
+    }
+
+    public String getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public void setProcessInstanceId(String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+    }
+
+	public Job withProcessInstanceId(String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+        return this;
+    }
+
+    public String getProcessInstanceUrl() {
+        return processInstanceUrl;
+    }
+
+    public void setProcessInstanceUrl(String processInstanceUrl) {
+        this.processInstanceUrl = processInstanceUrl;
+    }
+
+	public Job withProcessInstanceUrl(String processInstanceUrl) {
+        this.processInstanceUrl = processInstanceUrl;
+        return this;
+    }
+
+    public String getProcessDefinitionId() {
+        return processDefinitionId;
+    }
+
+    public void setProcessDefinitionId(String processDefinitionId) {
+        this.processDefinitionId = processDefinitionId;
+    }
+
+	public Job withProcessDefinitionId(String processDefinitionId) {
+        this.processDefinitionId = processDefinitionId;
+        return this;
+    }
+
+    public String getProcessDefinitionUrl() {
+        return processDefinitionUrl;
+    }
+
+    public void setProcessDefinitionUrl(String processDefinitionUrl) {
+        this.processDefinitionUrl = processDefinitionUrl;
+    }
+
+	public Job withProcessDefinitionUrl(String processDefinitionUrl) {
+        this.processDefinitionUrl = processDefinitionUrl;
+        return this;
+    }
+
+    public String getExecutionId() {
+        return executionId;
+    }
+
+    public void setExecutionId(String executionId) {
+        this.executionId = executionId;
+    }
+
+	public Job withExecutionId(String executionId) {
+        this.executionId = executionId;
+        return this;
+    }
+
+    public String getExecutionUrl() {
+        return executionUrl;
+    }
+
+    public void setExecutionUrl(String executionUrl) {
+        this.executionUrl = executionUrl;
+    }
+
+	public Job withExecutionUrl(String executionUrl) {
+        this.executionUrl = executionUrl;
+        return this;
+    }
+
+    public int getRetries() {
+        return retries;
+    }
+
+    public void setRetries(int retries) {
+        this.retries = retries;
+    }
+
+	public Job withRetries(int retries) {
+        this.retries = retries;
+        return this;
+    }
+
+    public String getExceptionMessage() {
+        return exceptionMessage;
+    }
+
+    public void setExceptionMessage(String exceptionMessage) {
+        this.exceptionMessage = exceptionMessage;
+    }
+
+	public Job withExceptionMessage(String exceptionMessage) {
+        this.exceptionMessage = exceptionMessage;
+        return this;
+    }
+
+    public OffsetDateTime getDueDate() {
+        return dueDate;
+    }
+
+    public void setDueDate(OffsetDateTime dueDate) {
+        this.dueDate = dueDate;
+    }
+
+	public Job withDueDate(OffsetDateTime dueDate) {
+        this.dueDate = dueDate;
+        return this;
+    }
+
+    public String getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(String tenantId) {
+        this.tenantId = tenantId;
+    }
+
+	public Job withTenantId(String tenantId) {
+        this.tenantId = tenantId;
+        return this;
+    }
+    
+    
+
+}
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/ResultList.java b/src/main/java/com/inteligr8/activiti/model/ResultList.java
similarity index 63%
rename from src/main/java/com/inteligr8/alfresco/activiti/model/ResultList.java
rename to src/main/java/com/inteligr8/activiti/model/ResultList.java
index 919203d..a202241 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/model/ResultList.java
+++ b/src/main/java/com/inteligr8/activiti/model/ResultList.java
@@ -1,5 +1,5 @@
 
-package com.inteligr8.alfresco.activiti.model;
+package com.inteligr8.activiti.model;
 
 import java.util.LinkedList;
 import java.util.List;
@@ -8,16 +8,28 @@ import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 @JsonInclude(JsonInclude.Include.NON_NULL)
-public class ResultList<T> {
-    
+public class ResultList<T> extends Datum {
+
+    @JsonProperty("data")
+    private List<T> data = new LinkedList<T>();
     @JsonProperty("size")
     private Integer size;
     @JsonProperty("total")
     private Integer total;
     @JsonProperty("start")
     private Integer start;
-    @JsonProperty("data")
-    private List<T> data = new LinkedList<T>();
+    @JsonProperty("sort")
+    private String sort;
+    @JsonProperty("order")
+    private String order;
+    
+    public List<T> getData() {
+        return data;
+    }
+    
+    public void setData(List<T> data) {
+        this.data = data;
+    }
     
     public Integer getSize() {
 		return size;
@@ -43,12 +55,20 @@ public class ResultList<T> {
 		this.start = start;
 	}
     
-    public List<T> getData() {
-		return data;
-	}
+    public String getSort() {
+        return sort;
+    }
     
-    public void setData(List<T> data) {
-		this.data = data;
-	}
+    public void setSort(String sort) {
+        this.sort = sort;
+    }
+    
+    public String getOrder() {
+        return order;
+    }
+    
+    public void setOrder(String order) {
+        this.order = order;
+    }
 
 }
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/ApsPublicRestApi.java b/src/main/java/com/inteligr8/alfresco/activiti/ApsPublicRestApi.java
index 3c90f08..d7a7010 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/ApsPublicRestApi.java
+++ b/src/main/java/com/inteligr8/alfresco/activiti/ApsPublicRestApi.java
@@ -14,10 +14,11 @@
  */
 package com.inteligr8.alfresco.activiti;
 
+import com.inteligr8.activiti.ActivitiPublicRestApi;
 import com.inteligr8.alfresco.activiti.api.AdminApi;
 import com.inteligr8.alfresco.activiti.api.AppDefinitionsApi;
 import com.inteligr8.alfresco.activiti.api.AppVersionApi;
-import com.inteligr8.alfresco.activiti.api.HistoricProcessInstancesApi;
+import com.inteligr8.alfresco.activiti.api.HistoricApi;
 import com.inteligr8.alfresco.activiti.api.ModelsApi;
 import com.inteligr8.alfresco.activiti.api.ProcessInstancesApi;
 import com.inteligr8.alfresco.activiti.api.ProfileApi;
@@ -30,7 +31,7 @@ import com.inteligr8.alfresco.activiti.api.TasksApi;
  * 
  * @author brian@inteligr8.com
  */
-public interface ApsPublicRestApi {
+public interface ApsPublicRestApi extends ActivitiPublicRestApi {
 	
 	<T> T getApi(Class<T> apiClass);
 	
@@ -46,8 +47,8 @@ public interface ApsPublicRestApi {
 		return this.getApi(AppVersionApi.class);
 	}
     
-    default HistoricProcessInstancesApi getHistoricProcessInstancesApi() {
-        return this.getApi(HistoricProcessInstancesApi.class);
+    default HistoricApi getHistoricProcessInstancesApi() {
+        return this.getApi(HistoricApi.class);
     }
 	
 	default ModelsApi getModelsApi() {
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/AdminApi.java b/src/main/java/com/inteligr8/alfresco/activiti/api/AdminApi.java
index 0b38b3d..7022b18 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/api/AdminApi.java
+++ b/src/main/java/com/inteligr8/alfresco/activiti/api/AdminApi.java
@@ -26,9 +26,9 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 
+import com.inteligr8.activiti.model.ResultList;
 import com.inteligr8.alfresco.activiti.model.Group;
 import com.inteligr8.alfresco.activiti.model.GroupLight;
-import com.inteligr8.alfresco.activiti.model.ResultList;
 import com.inteligr8.alfresco.activiti.model.Tenant;
 import com.inteligr8.alfresco.activiti.model.UserLight;
 
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/GroupsApi.java b/src/main/java/com/inteligr8/alfresco/activiti/api/GroupsApi.java
index 41cffe7..0346529 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/api/GroupsApi.java
+++ b/src/main/java/com/inteligr8/alfresco/activiti/api/GroupsApi.java
@@ -20,8 +20,8 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 
+import com.inteligr8.activiti.model.ResultList;
 import com.inteligr8.alfresco.activiti.model.GroupLight;
-import com.inteligr8.alfresco.activiti.model.ResultList;
 import com.inteligr8.alfresco.activiti.model.UserLight;
 
 @Path("/api/enterprise/groups")
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/HistoricProcessInstancesApi.java b/src/main/java/com/inteligr8/alfresco/activiti/api/HistoricApi.java
similarity index 73%
rename from src/main/java/com/inteligr8/alfresco/activiti/api/HistoricProcessInstancesApi.java
rename to src/main/java/com/inteligr8/alfresco/activiti/api/HistoricApi.java
index 2a16d05..5db781e 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/api/HistoricProcessInstancesApi.java
+++ b/src/main/java/com/inteligr8/alfresco/activiti/api/HistoricApi.java
@@ -20,16 +20,24 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
 import com.inteligr8.alfresco.activiti.model.HistoricProcessInstanceQueryRepresentation;
+import com.inteligr8.alfresco.activiti.model.HistoricTaskQueryRepresentation;
 import com.inteligr8.alfresco.activiti.model.ProcessInstance;
 import com.inteligr8.alfresco.activiti.model.ResultListDataRepresentation;
+import com.inteligr8.alfresco.activiti.model.Task;
 
-@Path("/api/enterprise/historic-process-instances")
-public interface HistoricProcessInstancesApi {
+@Path("/api/enterprise")
+public interface HistoricApi {
 
     @POST
-    @Path("query")
+    @Path("historic-process-instances/query")
     @Consumes({ "application/json" })
     @Produces({ "application/json" })
     ResultListDataRepresentation<ProcessInstance> query(HistoricProcessInstanceQueryRepresentation request);
 
+    @POST
+    @Path("historic-tasks/query")
+    @Consumes({ "application/json" })
+    @Produces({ "application/json" })
+    ResultListDataRepresentation<Task> query(HistoricTaskQueryRepresentation request);
+
 }
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessDefinitionsApi.java b/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessDefinitionsApi.java
new file mode 100644
index 0000000..676280d
--- /dev/null
+++ b/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessDefinitionsApi.java
@@ -0,0 +1,35 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+package com.inteligr8.alfresco.activiti.api;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+
+import com.inteligr8.alfresco.activiti.model.ProcessDefinition;
+import com.inteligr8.alfresco.activiti.model.ResultListDataRepresentation;
+
+@Path("/api/enterprise/process-definitions")
+public interface ProcessDefinitionsApi {
+
+    @GET
+    @Produces({ "application/json" })
+    ResultListDataRepresentation<ProcessDefinition> get(
+            @QueryParam("latest") Boolean latest,
+            @QueryParam("appDefinitionId") Integer appDefinitionId,
+            @QueryParam("deploymentId") String deploymentId);
+
+}
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstancesApi.java b/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstancesApi.java
index 7be99d2..a9cfa53 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstancesApi.java
+++ b/src/main/java/com/inteligr8/alfresco/activiti/api/ProcessInstancesApi.java
@@ -27,7 +27,9 @@ import javax.ws.rs.Produces;
 
 import com.inteligr8.alfresco.activiti.model.CreateProcessInstance;
 import com.inteligr8.alfresco.activiti.model.ProcessInstance;
+import com.inteligr8.alfresco.activiti.model.ProcessInstanceFilterRepresentation;
 import com.inteligr8.alfresco.activiti.model.ProcessInstanceQueryRepresentation;
+import com.inteligr8.alfresco.activiti.model.ProcessInstanceVariable;
 import com.inteligr8.alfresco.activiti.model.ResultListDataRepresentation;
 import com.inteligr8.alfresco.activiti.model.Variable;
 
@@ -39,6 +41,12 @@ public interface ProcessInstancesApi {
     @Produces({ "application/json" })
     ProcessInstance create(CreateProcessInstance processInstance);
 
+    @POST
+    @Path("filter")
+    @Consumes({ "application/json" })
+    @Produces({ "application/json" })
+    ResultListDataRepresentation<ProcessInstance> filter(ProcessInstanceFilterRepresentation request);
+
     @POST
     @Path("query")
     @Consumes({ "application/json" })
@@ -64,6 +72,11 @@ public interface ProcessInstancesApi {
     @Produces({ "application/json" })
     ProcessInstance suspend(@PathParam("processInstanceId") String processInstanceId);
     
+    @GET
+    @Path("{processInstanceId}/historic-variables")
+    @Produces({ "application/json" })
+    List<ProcessInstanceVariable> getHistoricVariables(@PathParam("processInstanceId") String processInstanceId);
+    
     @GET
     @Path("{processInstanceId}/variables")
     @Produces({ "application/json" })
@@ -88,6 +101,6 @@ public interface ProcessInstancesApi {
     
     @DELETE
     @Path("{processInstanceId}/variables/{variableName}")
-    void deleteVariable(@PathParam("processInstanceId") String processInstanceId, @PathParam("variableName") String variableName);
+    void removeVariable(@PathParam("processInstanceId") String processInstanceId, @PathParam("variableName") String variableName);
 
 }
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/ShareApi.java b/src/main/java/com/inteligr8/alfresco/activiti/api/ShareApi.java
index 21ed9b0..9a3da50 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/api/ShareApi.java
+++ b/src/main/java/com/inteligr8/alfresco/activiti/api/ShareApi.java
@@ -22,7 +22,7 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
-import com.inteligr8.alfresco.activiti.model.ResultList;
+import com.inteligr8.activiti.model.ResultList;
 import com.inteligr8.alfresco.activiti.model.ShareInfoRequest;
 import com.inteligr8.alfresco.activiti.model.SharePermission;
 
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/api/TasksApi.java b/src/main/java/com/inteligr8/alfresco/activiti/api/TasksApi.java
index 86f8844..1bce98f 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/api/TasksApi.java
+++ b/src/main/java/com/inteligr8/alfresco/activiti/api/TasksApi.java
@@ -19,36 +19,111 @@ import java.util.List;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
+import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 
+import com.inteligr8.alfresco.activiti.model.AssigneeIdentifier;
+import com.inteligr8.alfresco.activiti.model.HistoricTaskQueryRepresentation;
+import com.inteligr8.alfresco.activiti.model.ResultListDataRepresentation;
 import com.inteligr8.alfresco.activiti.model.Task;
+import com.inteligr8.alfresco.activiti.model.TaskQueryRepresentation;
 import com.inteligr8.alfresco.activiti.model.TaskUpdate;
+import com.inteligr8.alfresco.activiti.model.UserIdentifier;
 import com.inteligr8.alfresco.activiti.model.Variable;
 
 @Path("/api/enterprise/tasks")
 public interface TasksApi {
 
+    @GET
+    @Path("{taskId}")
+    @Produces({ "application/json" })
+    Task get(@PathParam("taskId") String taskId);
+
     @PUT
     @Path("{taskId}")
     @Consumes({ "application/json" })
     @Produces({ "application/json" })
-    public Task update(@PathParam("taskId") String taskId, TaskUpdate taskUpdate);
+    Task update(@PathParam("taskId") String taskId, TaskUpdate taskUpdate);
+
+    @DELETE
+    @Path("{taskId}")
+    @Produces({ "application/json" })
+    void delete(@PathParam("taskId") String taskId);
+
+    @POST
+    @Path("query")
+    @Produces({ "application/json" })
+    ResultListDataRepresentation<Task> query(TaskQueryRepresentation request);
+
+    @POST
+    @Path("filter")
+    @Produces({ "application/json" })
+    ResultListDataRepresentation<Task> query(HistoricTaskQueryRepresentation request);
+
+    @PUT
+    @Path("{taskId}/action/assign")
+    @Consumes({ "application/json" })
+    @Produces({ "application/json" })
+    Task assign(@PathParam("taskId") String taskId, AssigneeIdentifier request);
+
+    @PUT
+    @Path("{taskId}/action/claim")
+    void claim(@PathParam("taskId") String taskId);
+
+    @PUT
+    @Path("{taskId}/action/complete")
+    void complete(@PathParam("taskId") String taskId);
+
+    @PUT
+    @Path("{taskId}/action/delegate")
+    @Consumes({ "application/json" })
+    void delegate(@PathParam("taskId") String taskId, UserIdentifier request);
+
+    @PUT
+    @Path("{taskId}/action/involve")
+    @Consumes({ "application/json" })
+    void involve(@PathParam("taskId") String taskId, UserIdentifier request);
+
+    @POST
+    @Path("{taskId}/groups/{groupId}")
+    void involveGroup(@PathParam("taskId") String taskId, @PathParam("groupId") String groupId);
+
+    @DELETE
+    @Path("{taskId}/groups/{groupId}")
+    void removeInvolvedGroup(@PathParam("taskId") String taskId, @PathParam("groupId") String groupId);
+
+    @PUT
+    @Path("{taskId}/action/remove-involved")
+    @Consumes({ "application/json" })
+    void removeInvolved(@PathParam("taskId") String taskId, UserIdentifier request);
+
+    @PUT
+    @Path("{taskId}/action/resolve")
+    void resolve(@PathParam("taskId") String taskId);
+
+    @PUT
+    @Path("{taskId}/action/unclaim")
+    void unclaim(@PathParam("taskId") String taskId);
     
     @GET
     @Path("{taskId}/variables")
     @Produces({ "application/json" })
     List<Variable> getVariables(@PathParam("taskId") String taskId, @QueryParam("scope") String scope);
     
-    @PUT
+    @POST
     @Path("{taskId}/variables")
     @Consumes({ "application/json" })
     @Produces({ "application/json" })
     List<Variable> setVariables(@PathParam("taskId") String taskId, List<Variable> variables);
     
+    @DELETE
+    @Path("{taskId}/variables")
+    List<Variable> removeVariables(@PathParam("taskId") String taskId);
+    
     @GET
     @Path("{taskId}/variables/{variableName}")
     @Produces({ "application/json" })
@@ -62,6 +137,6 @@ public interface TasksApi {
     
     @DELETE
     @Path("{taskId}/variables/{variableName}")
-    void deleteVariable(@PathParam("taskId") String taskId, @PathParam("variableName") String variableName, @QueryParam("scope") String scope);
+    void removeVariable(@PathParam("taskId") String taskId, @PathParam("variableName") String variableName, @QueryParam("scope") String scope);
 
 }
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/AssigneeIdentifier.java b/src/main/java/com/inteligr8/alfresco/activiti/model/AssigneeIdentifier.java
new file mode 100644
index 0000000..cb63869
--- /dev/null
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/AssigneeIdentifier.java
@@ -0,0 +1,42 @@
+package com.inteligr8.alfresco.activiti.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class AssigneeIdentifier {
+	
+	@JsonProperty
+	private String assignee;
+	@JsonProperty
+	private String email;
+	
+    public String getAssignee() {
+        return assignee;
+    }
+    
+    public void setAssignee(String assignee) {
+        this.assignee = assignee;
+    }
+
+	public AssigneeIdentifier withAssignee(String assignee) {
+        this.assignee = assignee;
+        return this;
+    }
+    
+    public String getEmail() {
+        return email;
+    }
+    
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+	public AssigneeIdentifier withEmail(String email) {
+        this.email = email;
+        return this;
+    }
+
+}
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/HistoricProcessInstanceQueryRepresentation.java b/src/main/java/com/inteligr8/alfresco/activiti/model/HistoricProcessInstanceQueryRepresentation.java
index c73c606..16b754f 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/model/HistoricProcessInstanceQueryRepresentation.java
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/HistoricProcessInstanceQueryRepresentation.java
@@ -6,9 +6,11 @@ import java.time.OffsetDateTime;
 import java.util.LinkedList;
 import java.util.List;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonFormat.Shape;
 
 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({
@@ -43,8 +45,10 @@ public class HistoricProcessInstanceQueryRepresentation {
     @JsonProperty("finished")
     private Boolean finished;
     @JsonProperty("finishedAfter")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
     private OffsetDateTime finishedAfter;
     @JsonProperty("finishedBefore")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
     private OffsetDateTime finishedBefore;
     @JsonProperty("includeProcessVariables")
     private Boolean includeProcessVariables;
@@ -69,8 +73,10 @@ public class HistoricProcessInstanceQueryRepresentation {
     @JsonProperty("start")
     private Integer start;
     @JsonProperty("startedAfter")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
     private OffsetDateTime startedAfter;
     @JsonProperty("startedBefore")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
     private OffsetDateTime startedBefore;
     @JsonProperty("startedBy")
     private String startedBy;
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/HistoricTaskQueryRepresentation.java b/src/main/java/com/inteligr8/alfresco/activiti/model/HistoricTaskQueryRepresentation.java
new file mode 100644
index 0000000..97d30fb
--- /dev/null
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/HistoricTaskQueryRepresentation.java
@@ -0,0 +1,835 @@
+
+
+package com.inteligr8.alfresco.activiti.model;
+
+import java.time.OffsetDateTime;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonFormat.Shape;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+    "taskId",
+    "parentTaskId",
+    "taskName",
+    "taskNameLike",
+    "taskDefinitionKey",
+    "taskDefinitionKeyLike",
+    "finished",
+    "taskPriority",
+    "taskMinPriority",
+    "taskMaxPriority",
+    "taskAssignee",
+    "taskAssigneeLike",
+    "taskOwner",
+    "taskOwnerLike",
+    "taskInvolvedUser",
+    "taskCandidateGroup",
+    "taskCreatedOn",
+    "taskCreatedAfter",
+    "taskCreatedBefore",
+    "dueDate",
+    "dueDateAfter",
+    "dueDateBefore",
+    "withoutDueDate",
+    "taskCompletedOn",
+    "taskCompletedAfter",
+    "taskCompletedBefore",
+    "taskDeleteReason",
+    "taskDeleteReasonLike",
+    "taskDescription",
+    "taskDescriptionLike",
+    "processBusinessKey",
+    "processBusinessKeyLike",
+    "processDefinitionId",
+    "processDefinitionKey",
+    "processDefinitionKeyLike",
+    "processDefinitionName",
+    "processDefinitionNameLike",
+    "processFinished",
+    "processInstanceId",
+    "includeProcessVariables",
+    "includeTaskLocalVariables",
+    "processVariables",
+    "taskVariables",
+    "size",
+    "sort",
+    "order",
+    "start",
+    "tenantId",
+    "tenantIdLike",
+    "withoutTenantId",
+})
+public class HistoricTaskQueryRepresentation {
+
+    @JsonProperty("taskId")
+    private String taskId;
+    @JsonProperty("parentTaskId")
+    private String parentTaskId;
+    @JsonProperty("taskName")
+    private String taskName;
+    @JsonProperty("taskNameLike")
+    private String taskNameLike;
+    @JsonProperty("taskDefinitionKey")
+    private String taskDefinitionKey;
+    @JsonProperty("taskDefinitionKeyLike")
+    private String taskDefinitionKeyLike;
+    @JsonProperty("finished")
+    private Boolean finished;
+    @JsonProperty("taskPriority")
+    private Integer taskPriority;
+    @JsonProperty("taskMinPriority")
+    private Integer taskMinPriority;
+    @JsonProperty("taskMaxPriority")
+    private Integer taskMaxPriority;
+    @JsonProperty("taskAssignee")
+    private String taskAssignee;
+    @JsonProperty("taskAssigneeLike")
+    private String taskAssigneeLike;
+    @JsonProperty("taskOwner")
+    private String taskOwner;
+    @JsonProperty("taskOwnerLike")
+    private String taskOwnerLike;
+    @JsonProperty("taskInvolvedUser")
+    private String taskInvolvedUser;
+    @JsonProperty("taskCandidateGroup")
+    private String taskCandidateGroup;
+    @JsonProperty("taskCreatedOn")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime taskCreated;
+    @JsonProperty("taskCreatedBefore")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime taskCreatedBefore;
+    @JsonProperty("taskCreatedAfter")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime taskCreatedAfter;
+    @JsonProperty("dueDate")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime dueDate;
+    @JsonProperty("dueDateBefore")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime dueDateBefore;
+    @JsonProperty("dueDateAfter")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime dueDateAfter;
+    @JsonProperty("withoutDueDate")
+    private Boolean withoutDueDate;
+    @JsonProperty("taskCompletedOn")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime taskCompleted;
+    @JsonProperty("taskCompletedBefore")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime taskCompletedBefore;
+    @JsonProperty("taskCompletedAfter")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime taskCompletedAfter;
+    @JsonProperty("taskDeleteReason")
+    private String taskDeleteReason;
+    @JsonProperty("taskDeleteReasonLike")
+    private String taskDeleteReasonLike;
+    @JsonProperty("taskDescription")
+    private String taskDescription;
+    @JsonProperty("taskDescriptionLike")
+    private String taskDescriptionLike;
+    @JsonProperty("processBusinessKey")
+    private String processBusinessKey;
+    @JsonProperty("processBusinessKeyLike")
+    private String processBusinessKeyLike;
+    @JsonProperty("processDefinitionId")
+    private String processDefinitionId;
+    @JsonProperty("processDefinitionKey")
+    private String processDefinitionKey;
+    @JsonProperty("processDefinitionKeyLike")
+    private String processDefinitionKeyLike;
+    @JsonProperty("processDefinitionName")
+    private String processDefinitionName;
+    @JsonProperty("processDefinitionNameLike")
+    private String processDefinitionNameLike;
+    @JsonProperty("processFinished")
+    private Boolean processFinished;
+    @JsonProperty("processInstanceId")
+    private String processInstanceId;
+    @JsonProperty("includeProcessVariables")
+    private Boolean includeProcessVariables;
+    @JsonProperty("includeTaskLocalVariables")
+    private Boolean includeTaskLocalVariables;
+    @JsonProperty("taskVariables")
+    private List<QueryVariable> taskVariables;
+    @JsonProperty("processVariables")
+    private List<QueryVariable> processVariables;
+    @JsonProperty("size")
+    private Integer size;
+    @JsonProperty("sort")
+    private String sort;
+    @JsonProperty("order")
+    private String order;
+    @JsonProperty("start")
+    private Integer start;
+    @JsonProperty("tenantId")
+    private String tenantId;
+    @JsonProperty("tenantIdLike")
+    private String tenantIdLike;
+    @JsonProperty("withoutTenantId")
+    private Boolean withoutTenantId;
+
+    /**
+     * No args constructor for use in serialization
+     */
+    public HistoricTaskQueryRepresentation() {
+    }
+
+    public String getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+
+    public HistoricTaskQueryRepresentation withTaskId(String taskId) {
+        this.taskId = taskId;
+        return this;
+    }
+
+    public String getParentTaskId() {
+        return parentTaskId;
+    }
+
+    public void setParentTaskId(String parentTaskId) {
+        this.parentTaskId = parentTaskId;
+    }
+
+	public HistoricTaskQueryRepresentation withParentTaskId(String parentTaskId) {
+        this.parentTaskId = parentTaskId;
+        return this;
+    }
+
+    public String getTaskName() {
+        return taskName;
+    }
+
+    public void setTaskName(String taskName) {
+        this.taskName = taskName;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskName(String taskName) {
+        this.taskName = taskName;
+        return this;
+    }
+
+    public String getTaskNameLike() {
+        return taskNameLike;
+    }
+
+    public void setTaskNameLike(String taskNameLike) {
+        this.taskNameLike = taskNameLike;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskNameLike(String taskNameLike) {
+        this.taskNameLike = taskNameLike;
+        return this;
+    }
+
+    public String getTaskDefinitionKey() {
+        return taskDefinitionKey;
+    }
+
+    public void setTaskDefinitionKey(String taskDefinitionKey) {
+        this.taskDefinitionKey = taskDefinitionKey;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskDefinitionKey(String taskDefinitionKey) {
+        this.taskDefinitionKey = taskDefinitionKey;
+        return this;
+    }
+
+    public String getTaskDefinitionKeyLike() {
+        return taskDefinitionKeyLike;
+    }
+
+    public void setTaskDefinitionKeyLike(String taskDefinitionKeyLike) {
+        this.taskDefinitionKeyLike = taskDefinitionKeyLike;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskDefinitionKeyLike(String taskDefinitionKeyLike) {
+        this.taskDefinitionKeyLike = taskDefinitionKeyLike;
+        return this;
+    }
+
+    public Boolean getFinished() {
+        return finished;
+    }
+
+    public void setFinished(Boolean finished) {
+        this.finished = finished;
+    }
+
+	public HistoricTaskQueryRepresentation withFinished(Boolean finished) {
+        this.finished = finished;
+        return this;
+    }
+
+    public Integer getTaskPriority() {
+        return taskPriority;
+    }
+
+    public void setTaskPriority(Integer taskPriority) {
+        this.taskPriority = taskPriority;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskPriority(Integer taskPriority) {
+        this.taskPriority = taskPriority;
+        return this;
+    }
+
+    public Integer getTaskMinPriority() {
+        return taskMinPriority;
+    }
+
+    public void setTaskMinPriority(Integer taskMinPriority) {
+        this.taskMinPriority = taskMinPriority;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskMinPriority(Integer taskMinPriority) {
+        this.taskMinPriority = taskMinPriority;
+        return this;
+    }
+
+    public Integer getTaskMaxPriority() {
+        return taskMaxPriority;
+    }
+
+    public void setTaskMaxPriority(Integer taskMaxPriority) {
+        this.taskMaxPriority = taskMaxPriority;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskMaxPriority(Integer taskMaxPriority) {
+        this.taskMaxPriority = taskMaxPriority;
+        return this;
+    }
+
+    public String getTaskAssignee() {
+        return taskAssignee;
+    }
+
+    public void setTaskAssignee(String taskAssignee) {
+        this.taskAssignee = taskAssignee;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskAssignee(String taskAssignee) {
+        this.taskAssignee = taskAssignee;
+        return this;
+    }
+
+    public String getTaskAssigneeLike() {
+        return taskAssigneeLike;
+    }
+
+    public void setTaskAssigneeLike(String taskAssigneeLike) {
+        this.taskAssigneeLike = taskAssigneeLike;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskAssigneeLike(String taskAssigneeLike) {
+        this.taskAssigneeLike = taskAssigneeLike;
+        return this;
+    }
+
+    public String getTaskOwner() {
+        return taskOwner;
+    }
+
+    public void setTaskOwner(String taskOwner) {
+        this.taskOwner = taskOwner;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskOwner(String taskOwner) {
+        this.taskOwner = taskOwner;
+        return this;
+    }
+
+    public String getTaskOwnerLike() {
+        return taskOwnerLike;
+    }
+
+    public void setTaskOwnerLike(String taskOwnerLike) {
+        this.taskOwnerLike = taskOwnerLike;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskOwnerLike(String taskOwnerLike) {
+        this.taskOwnerLike = taskOwnerLike;
+        return this;
+    }
+
+    public String getTaskInvolvedUser() {
+        return taskInvolvedUser;
+    }
+
+    public void setTaskInvolvedUser(String taskInvolvedUser) {
+        this.taskInvolvedUser = taskInvolvedUser;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskInvolvedUser(String taskInvolvedUser) {
+        this.taskInvolvedUser = taskInvolvedUser;
+        return this;
+    }
+
+    public String getTaskCandidateGroup() {
+        return taskCandidateGroup;
+    }
+
+    public void setTaskCandidateGroup(String taskCandidateGroup) {
+        this.taskCandidateGroup = taskCandidateGroup;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskCandidateGroup(String taskCandidateGroup) {
+        this.taskCandidateGroup = taskCandidateGroup;
+        return this;
+    }
+
+    public OffsetDateTime getTaskCreated() {
+        return taskCreated;
+    }
+
+    public void setTaskCreated(OffsetDateTime taskCreated) {
+        this.taskCreated = taskCreated;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskCreated(OffsetDateTime taskCreated) {
+        this.taskCreated = taskCreated;
+        return this;
+    }
+
+    public OffsetDateTime getTaskCreatedBefore() {
+        return taskCreatedBefore;
+    }
+
+    public void setTaskCreatedBefore(OffsetDateTime taskCreatedBefore) {
+        this.taskCreatedBefore = taskCreatedBefore;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskCreatedBefore(OffsetDateTime taskCreatedBefore) {
+        this.taskCreatedBefore = taskCreatedBefore;
+        return this;
+    }
+
+    public OffsetDateTime getTaskCreatedAfter() {
+        return taskCreatedAfter;
+    }
+
+    public void setTaskCreatedAfter(OffsetDateTime taskCreatedAfter) {
+        this.taskCreatedAfter = taskCreatedAfter;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskCreatedAfter(OffsetDateTime taskCreatedAfter) {
+        this.taskCreatedAfter = taskCreatedAfter;
+        return this;
+    }
+
+    public OffsetDateTime getDueDate() {
+        return dueDate;
+    }
+
+    public void setDueDate(OffsetDateTime dueDate) {
+        this.dueDate = dueDate;
+    }
+
+	public HistoricTaskQueryRepresentation withDueDate(OffsetDateTime dueDate) {
+        this.dueDate = dueDate;
+        return this;
+    }
+
+    public OffsetDateTime getDueDateBefore() {
+        return dueDateBefore;
+    }
+
+    public void setDueDateBefore(OffsetDateTime dueDateBefore) {
+        this.dueDateBefore = dueDateBefore;
+    }
+
+	public HistoricTaskQueryRepresentation withDueDateBefore(OffsetDateTime dueDateBefore) {
+        this.dueDateBefore = dueDateBefore;
+        return this;
+    }
+
+    public OffsetDateTime getDueDateAfter() {
+        return dueDateAfter;
+    }
+
+    public void setDueDateAfter(OffsetDateTime dueDateAfter) {
+        this.dueDateAfter = dueDateAfter;
+    }
+
+	public HistoricTaskQueryRepresentation withDueDateAfter(OffsetDateTime dueDateAfter) {
+        this.dueDateAfter = dueDateAfter;
+        return this;
+    }
+
+    public Boolean getWithoutDueDate() {
+        return withoutDueDate;
+    }
+
+    public void setWithoutDueDate(Boolean withoutDueDate) {
+        this.withoutDueDate = withoutDueDate;
+    }
+
+	public HistoricTaskQueryRepresentation withWithoutDueDate(Boolean withoutDueDate) {
+        this.withoutDueDate = withoutDueDate;
+        return this;
+    }
+
+    public OffsetDateTime getTaskCompleted() {
+        return taskCompleted;
+    }
+
+    public void setTaskCompleted(OffsetDateTime taskCompleted) {
+        this.taskCompleted = taskCompleted;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskCompleted(OffsetDateTime taskCompleted) {
+        this.taskCompleted = taskCompleted;
+        return this;
+    }
+
+    public OffsetDateTime getTaskCompletedBefore() {
+        return taskCompletedBefore;
+    }
+
+    public void setTaskCompletedBefore(OffsetDateTime taskCompletedBefore) {
+        this.taskCompletedBefore = taskCompletedBefore;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskCompletedBefore(OffsetDateTime taskCompletedBefore) {
+        this.taskCompletedBefore = taskCompletedBefore;
+        return this;
+    }
+
+    public OffsetDateTime getTaskCompletedAfter() {
+        return taskCompletedAfter;
+    }
+
+    public void setTaskCompletedAfter(OffsetDateTime taskCompletedAfter) {
+        this.taskCompletedAfter = taskCompletedAfter;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskCompletedAfter(OffsetDateTime taskCompletedAfter) {
+        this.taskCompletedAfter = taskCompletedAfter;
+        return this;
+    }
+
+    public String getTaskDeleteReason() {
+        return taskDeleteReason;
+    }
+
+    public void setTaskDeleteReason(String taskDeleteReason) {
+        this.taskDeleteReason = taskDeleteReason;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskDeleteReason(String taskDeleteReason) {
+        this.taskDeleteReason = taskDeleteReason;
+        return this;
+    }
+
+    public String getTaskDeleteReasonLike() {
+        return taskDeleteReasonLike;
+    }
+
+    public void setTaskDeleteReasonLike(String taskDeleteReasonLike) {
+        this.taskDeleteReasonLike = taskDeleteReasonLike;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskDeleteReasonLike(String taskDeleteReasonLike) {
+        this.taskDeleteReasonLike = taskDeleteReasonLike;
+        return this;
+    }
+
+    public String getTaskDescription() {
+        return taskDescription;
+    }
+
+    public void setTaskDescription(String taskDescription) {
+        this.taskDescription = taskDescription;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskDescription(String taskDescription) {
+        this.taskDescription = taskDescription;
+        return this;
+    }
+
+    public String getTaskDescriptionLike() {
+        return taskDescriptionLike;
+    }
+
+    public void setTaskDescriptionLike(String taskDescriptionLike) {
+        this.taskDescriptionLike = taskDescriptionLike;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskDescriptionLike(String taskDescriptionLike) {
+        this.taskDescriptionLike = taskDescriptionLike;
+        return this;
+    }
+
+    public String getProcessBusinessKey() {
+        return processBusinessKey;
+    }
+
+    public void setProcessBusinessKey(String processBusinessKey) {
+        this.processBusinessKey = processBusinessKey;
+    }
+
+	public HistoricTaskQueryRepresentation withProcessBusinessKey(String processBusinessKey) {
+        this.processBusinessKey = processBusinessKey;
+        return this;
+    }
+
+    public String getProcessBusinessKeyLike() {
+        return processBusinessKeyLike;
+    }
+
+    public void setProcessBusinessKeyLike(String processBusinessKeyLike) {
+        this.processBusinessKeyLike = processBusinessKeyLike;
+    }
+
+	public HistoricTaskQueryRepresentation withProcessBusinessKeyLike(String processBusinessKeyLike) {
+        this.processBusinessKeyLike = processBusinessKeyLike;
+        return this;
+    }
+
+    public String getProcessDefinitionId() {
+        return processDefinitionId;
+    }
+
+    public void setProcessDefinitionId(String processDefinitionId) {
+        this.processDefinitionId = processDefinitionId;
+    }
+
+	public HistoricTaskQueryRepresentation withProcessDefinitionId(String processDefinitionId) {
+        this.processDefinitionId = processDefinitionId;
+        return this;
+    }
+
+    public String getProcessDefinitionKey() {
+        return processDefinitionKey;
+    }
+
+    public void setProcessDefinitionKey(String processDefinitionKey) {
+        this.processDefinitionKey = processDefinitionKey;
+    }
+
+	public HistoricTaskQueryRepresentation withProcessDefinitionKey(String processDefinitionKey) {
+        this.processDefinitionKey = processDefinitionKey;
+        return this;
+    }
+
+    public String getProcessDefinitionKeyLike() {
+        return processDefinitionKeyLike;
+    }
+
+    public void setProcessDefinitionKeyLike(String processDefinitionKeyLike) {
+        this.processDefinitionKeyLike = processDefinitionKeyLike;
+    }
+
+	public HistoricTaskQueryRepresentation withProcessDefinitionKeyLike(String processDefinitionKeyLike) {
+        this.processDefinitionKeyLike = processDefinitionKeyLike;
+        return this;
+    }
+
+    public String getProcessDefinitionName() {
+        return processDefinitionName;
+    }
+
+    public void setProcessDefinitionName(String processDefinitionName) {
+        this.processDefinitionName = processDefinitionName;
+    }
+
+	public HistoricTaskQueryRepresentation withProcessDefinitionName(String processDefinitionName) {
+        this.processDefinitionName = processDefinitionName;
+        return this;
+    }
+
+    public String getProcessDefinitionNameLike() {
+        return processDefinitionNameLike;
+    }
+
+    public void setProcessDefinitionNameLike(String processDefinitionNameLike) {
+        this.processDefinitionNameLike = processDefinitionNameLike;
+    }
+
+	public HistoricTaskQueryRepresentation withProcessDefinitionNameLike(String processDefinitionNameLike) {
+        this.processDefinitionNameLike = processDefinitionNameLike;
+        return this;
+    }
+
+    public Boolean getProcessFinished() {
+        return processFinished;
+    }
+
+    public void setProcessFinished(Boolean processFinished) {
+        this.processFinished = processFinished;
+    }
+
+	public HistoricTaskQueryRepresentation withProcessFinished(Boolean processFinished) {
+        this.processFinished = processFinished;
+        return this;
+    }
+
+    public String getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public void setProcessInstanceId(String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+    }
+
+	public HistoricTaskQueryRepresentation withProcessInstanceId(String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+        return this;
+    }
+
+    public Boolean getIncludeProcessVariables() {
+        return includeProcessVariables;
+    }
+
+    public void setIncludeProcessVariables(Boolean includeProcessVariables) {
+        this.includeProcessVariables = includeProcessVariables;
+    }
+
+	public HistoricTaskQueryRepresentation withIncludeProcessVariables(Boolean includeProcessVariables) {
+        this.includeProcessVariables = includeProcessVariables;
+        return this;
+    }
+
+    public Boolean getIncludeTaskLocalVariables() {
+        return includeTaskLocalVariables;
+    }
+
+    public void setIncludeTaskLocalVariables(Boolean includeTaskLocalVariables) {
+        this.includeTaskLocalVariables = includeTaskLocalVariables;
+    }
+
+	public HistoricTaskQueryRepresentation withIncludeTaskLocalVariables(Boolean includeTaskLocalVariables) {
+        this.includeTaskLocalVariables = includeTaskLocalVariables;
+        return this;
+    }
+
+    public List<QueryVariable> getTaskVariables() {
+        return taskVariables;
+    }
+
+    public void setTaskVariables(List<QueryVariable> taskVariables) {
+        this.taskVariables = taskVariables;
+    }
+
+	public HistoricTaskQueryRepresentation withTaskVariables(List<QueryVariable> taskVariables) {
+        this.taskVariables = taskVariables;
+        return this;
+    }
+
+    public List<QueryVariable> getProcessVariables() {
+        return processVariables;
+    }
+
+    public void setProcessVariables(List<QueryVariable> processVariables) {
+        this.processVariables = processVariables;
+    }
+
+	public HistoricTaskQueryRepresentation withProcessVariables(List<QueryVariable> processVariables) {
+        this.processVariables = processVariables;
+        return this;
+    }
+
+    public Integer getSize() {
+        return size;
+    }
+
+    public void setSize(Integer size) {
+        this.size = size;
+    }
+
+	public HistoricTaskQueryRepresentation withSize(Integer size) {
+        this.size = size;
+        return this;
+    }
+
+    public String getSort() {
+        return sort;
+    }
+
+    public void setSort(String sort) {
+        this.sort = sort;
+    }
+
+	public HistoricTaskQueryRepresentation withSort(String sort) {
+        this.sort = sort;
+        return this;
+    }
+
+    public String getOrder() {
+        return order;
+    }
+
+    public void setOrder(String order) {
+        this.order = order;
+    }
+
+	public HistoricTaskQueryRepresentation withOrder(String order) {
+        this.order = order;
+        return this;
+    }
+
+    public Integer getStart() {
+        return start;
+    }
+
+    public void setStart(Integer start) {
+        this.start = start;
+    }
+
+	public HistoricTaskQueryRepresentation withStart(Integer start) {
+        this.start = start;
+        return this;
+    }
+
+    public String getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(String tenantId) {
+        this.tenantId = tenantId;
+    }
+
+	public HistoricTaskQueryRepresentation withTenantId(String tenantId) {
+        this.tenantId = tenantId;
+        return this;
+    }
+
+    public String getTenantIdLike() {
+        return tenantIdLike;
+    }
+
+    public void setTenantIdLike(String tenantIdLike) {
+        this.tenantIdLike = tenantIdLike;
+    }
+
+	public HistoricTaskQueryRepresentation withTenantIdLike(String tenantIdLike) {
+        this.tenantIdLike = tenantIdLike;
+        return this;
+    }
+
+    public Boolean getWithoutTenantId() {
+        return withoutTenantId;
+    }
+
+    public void setWithoutTenantId(Boolean withoutTenantId) {
+        this.withoutTenantId = withoutTenantId;
+    }
+
+	public HistoricTaskQueryRepresentation withWithoutTenantId(Boolean withoutTenantId) {
+        this.withoutTenantId = withoutTenantId;
+        return this;
+    }
+
+}
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessDefinition.java b/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessDefinition.java
new file mode 100644
index 0000000..5da3b87
--- /dev/null
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessDefinition.java
@@ -0,0 +1,166 @@
+
+
+package com.inteligr8.alfresco.activiti.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.inteligr8.activiti.model.Datum;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+    "id",
+    "key",
+    "name",
+    "description",
+    "hasStartForm",
+    "deploymentId",
+    "version",
+    "category",
+    "tenantId"
+})
+public class ProcessDefinition extends Datum {
+
+    @JsonProperty("category")
+    private String category;
+    @JsonProperty("deploymentId")
+    private String deploymentId;
+    @JsonProperty("description")
+    private String description;
+    @JsonProperty("hasStartForm")
+    private boolean hasStartForm;
+    @JsonProperty("id")
+    private String id;
+    @JsonProperty("key")
+    private String key;
+    @JsonProperty("name")
+    private String name;
+    @JsonProperty("tenantId")
+    private String tenantId;
+    @JsonProperty("version")
+    private Integer version;
+
+    /**
+     * No args constructor for use in serialization
+     */
+    public ProcessDefinition() {
+    }
+    
+    public String getCategory() {
+        return category;
+    }
+    
+    public void setCategory(String category) {
+        this.category = category;
+    }
+    
+    public ProcessDefinition withCategory(String category) {
+        this.category = category;
+        return this;
+    }
+    
+    public String getDeploymentId() {
+        return deploymentId;
+    }
+    
+    public void setDeploymentId(String deploymentId) {
+        this.deploymentId = deploymentId;
+    }
+    
+    public ProcessDefinition withDeploymentId(String deploymentId) {
+        this.deploymentId = deploymentId;
+        return this;
+    }
+    
+    public String getDescription() {
+        return description;
+    }
+    
+    public void setDescription(String description) {
+        this.description = description;
+    }
+    
+    public ProcessDefinition withDescription(String description) {
+        this.description = description;
+        return this;
+    }
+    
+    public boolean isHasStartForm() {
+        return hasStartForm;
+    }
+    
+    public void setHasStartForm(boolean hasStartForm) {
+        this.hasStartForm = hasStartForm;
+    }
+    
+    public ProcessDefinition withHasStartForm(boolean hasStartForm) {
+        this.hasStartForm = hasStartForm;
+        return this;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public ProcessDefinition withId(String id) {
+        this.id = id;
+        return this;
+    }
+    
+    public String getKey() {
+        return key;
+    }
+    
+    public void setKey(String key) {
+        this.key = key;
+    }
+    
+    public ProcessDefinition withKey(String key) {
+        this.key = key;
+        return this;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public ProcessDefinition withName(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public String getTenantId() {
+        return tenantId;
+    }
+
+    public void setTenantId(String tenantId) {
+        this.tenantId = tenantId;
+    }
+
+    public ProcessDefinition withTenantId(String tenantId) {
+        this.tenantId = tenantId;
+        return this;
+    }
+    
+    public Integer getVersion() {
+        return version;
+    }
+    
+    public void setVersion(Integer version) {
+        this.version = version;
+    }
+    
+    public ProcessDefinition withVersion(Integer version) {
+        this.version = version;
+        return this;
+    }
+
+}
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstance.java b/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstance.java
index c69fd67..52c16f6 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstance.java
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstance.java
@@ -2,12 +2,16 @@
 
 package com.inteligr8.alfresco.activiti.model;
 
+import java.time.OffsetDateTime;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonFormat.Shape;
+import com.inteligr8.activiti.model.Datum;
 
 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({
@@ -35,7 +39,8 @@ public class ProcessInstance extends Datum {
     @JsonProperty("businessKey")
     private String businessKey;
     @JsonProperty("ended")
-    private String ended;
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime ended;
     @JsonProperty("graphicalNotationDefined")
     private Boolean graphicalNotationDefined;
     @JsonProperty("id")
@@ -59,7 +64,8 @@ public class ProcessInstance extends Datum {
     @JsonProperty("startFormDefined")
     private Boolean startFormDefined;
     @JsonProperty("started")
-    private String started;
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime started;
     @JsonProperty("startedBy")
     private UserLight startedBy;
     @JsonProperty("suspended")
@@ -88,15 +94,15 @@ public class ProcessInstance extends Datum {
         return this;
     }
 
-    public String getEnded() {
+    public OffsetDateTime getEnded() {
         return ended;
     }
 
-    public void setEnded(String ended) {
+    public void setEnded(OffsetDateTime ended) {
         this.ended = ended;
     }
 
-    public ProcessInstance withEnded(String ended) {
+    public ProcessInstance withEnded(OffsetDateTime ended) {
         this.ended = ended;
         return this;
     }
@@ -244,15 +250,15 @@ public class ProcessInstance extends Datum {
         return this;
     }
 
-    public String getStarted() {
+    public OffsetDateTime getStarted() {
         return started;
     }
 
-    public void setStarted(String started) {
+    public void setStarted(OffsetDateTime started) {
         this.started = started;
     }
 
-    public ProcessInstance withStarted(String started) {
+    public ProcessInstance withStarted(OffsetDateTime started) {
         this.started = started;
         return this;
     }
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstanceFilter.java b/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstanceFilter.java
new file mode 100644
index 0000000..6beb1d4
--- /dev/null
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstanceFilter.java
@@ -0,0 +1,127 @@
+
+
+package com.inteligr8.alfresco.activiti.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.inteligr8.activiti.model.Datum;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+    "name",
+    "processDefinitionId",
+    "processDefinitionKey",
+    "sort",
+    "asc",
+    "state"
+})
+public class ProcessInstanceFilter extends Datum {
+    
+    public enum State {
+        @JsonProperty("all")
+        All,
+        @JsonProperty("completed")
+        Completed,
+        @JsonProperty("running")
+        Running
+    }
+
+    @JsonProperty("name")
+    private String name;
+    @JsonProperty("processDefinitionId")
+    private String processDefinitionId;
+    @JsonProperty("processDefinitionKey")
+    private String processDefinitionKey;
+    @JsonProperty("sort")
+    private String sort;
+    @JsonProperty("asc")
+    private Boolean asc;
+    @JsonProperty("state")
+    private State state;
+
+    /**
+     * No args constructor for use in serialization
+     */
+    public ProcessInstanceFilter() {
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public ProcessInstanceFilter withName(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public String getProcessDefinitionId() {
+        return processDefinitionId;
+    }
+
+    public void setProcessDefinitionId(String id) {
+        this.processDefinitionId = id;
+    }
+
+    public ProcessInstanceFilter withProcessDefinitionId(String id) {
+        this.processDefinitionId = id;
+        return this;
+    }
+    
+    public String getProcessDefinitionKey() {
+        return processDefinitionKey;
+    }
+    
+    public void setProcessDefinitionKey(String key) {
+        this.processDefinitionKey = key;
+    }
+    
+    public ProcessInstanceFilter withProcessDefinitionKey(String key) {
+        this.processDefinitionKey = key;
+        return this;
+    }
+    
+    public String getSort() {
+        return sort;
+    }
+    
+    public void setSort(String sort) {
+        this.sort = sort;
+    }
+    
+    public ProcessInstanceFilter withSort(String sort) {
+        this.sort = sort;
+        return this;
+    }
+    
+    public Boolean isAsc() {
+        return asc;
+    }
+    
+    public void setAsc(Boolean asc) {
+        this.asc = asc;
+    }
+    
+    public ProcessInstanceFilter withAsc(Boolean asc) {
+        this.asc = asc;
+        return this;
+    }
+    
+    public State getState() {
+        return state;
+    }
+    
+    public void setState(State state) {
+        this.state = state;
+    }
+    
+    public ProcessInstanceFilter withState(State state) {
+        this.state = state;
+        return this;
+    }
+
+}
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstanceFilterRepresentation.java b/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstanceFilterRepresentation.java
new file mode 100644
index 0000000..ebc00f6
--- /dev/null
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstanceFilterRepresentation.java
@@ -0,0 +1,101 @@
+
+
+package com.inteligr8.alfresco.activiti.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+    "filterId",
+    "filter",
+    "appDefinitionId",
+    "page",
+    "size"
+})
+public class ProcessInstanceFilterRepresentation {
+
+    @JsonProperty("filterId")
+    private Long filterId;
+    @JsonProperty("filter")
+    private ProcessInstanceFilter filter;
+    @JsonProperty("appDefinitionId")
+    private Long appDefinitionId;
+    @JsonProperty("page")
+    private Integer page;
+    @JsonProperty("size")
+    private Integer size;
+
+    /**
+     * No args constructor for use in serialization
+     */
+    public ProcessInstanceFilterRepresentation() {
+    }
+    
+    public Long getFilterId() {
+        return filterId;
+    }
+    
+    public void setFilterId(Long filterId) {
+        this.filterId = filterId;
+    }
+    
+    public ProcessInstanceFilterRepresentation withFilterId(Long filterId) {
+        this.filterId = filterId;
+        return this;
+    }
+    
+    public ProcessInstanceFilter getFilter() {
+        return filter;
+    }
+    
+    public void setFilter(ProcessInstanceFilter filter) {
+        this.filter = filter;
+    }
+    
+    public ProcessInstanceFilterRepresentation withFilter(ProcessInstanceFilter filter) {
+        this.filter = filter;
+        return this;
+    }
+
+    public Long getAppDefinitionId() {
+        return appDefinitionId;
+    }
+
+    public void setAppDefinitionId(Long appDefinitionId) {
+        this.appDefinitionId = appDefinitionId;
+    }
+
+    public ProcessInstanceFilterRepresentation withAppDefinitionId(Long appDefinitionId) {
+        this.appDefinitionId = appDefinitionId;
+        return this;
+    }
+    
+    public Integer getPage() {
+        return page;
+    }
+    
+    public void setPage(Integer page) {
+        this.page = page;
+    }
+    
+    public ProcessInstanceFilterRepresentation withPage(Integer page) {
+        this.page = page;
+        return this;
+    }
+
+    public Integer getSize() {
+        return size;
+    }
+
+    public void setSize(Integer size) {
+        this.size = size;
+    }
+
+    public ProcessInstanceFilterRepresentation withSize(Integer size) {
+        this.size = size;
+        return this;
+    }
+
+}
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstanceQueryRepresentation.java b/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstanceQueryRepresentation.java
index 2949b2c..971b23a 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstanceQueryRepresentation.java
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstanceQueryRepresentation.java
@@ -45,6 +45,8 @@ public class ProcessInstanceQueryRepresentation {
     private String processDefinitionId;
     @JsonProperty("processInstanceId")
     private String processInstanceId;
+    @JsonProperty("page")
+    private Integer page;
     @JsonProperty("size")
     private Integer size;
     @JsonProperty("sort")
@@ -98,6 +100,19 @@ public class ProcessInstanceQueryRepresentation {
         this.processInstanceId = processInstanceId;
         return this;
     }
+    
+    public Integer getPage() {
+        return page;
+    }
+    
+    public void setPage(Integer page) {
+        this.page = page;
+    }
+    
+    public ProcessInstanceQueryRepresentation withPage(Integer page) {
+        this.page = page;
+        return this;
+    }
 
     public Integer getSize() {
         return size;
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstanceVariable.java b/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstanceVariable.java
new file mode 100644
index 0000000..06c9365
--- /dev/null
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/ProcessInstanceVariable.java
@@ -0,0 +1,73 @@
+package com.inteligr8.alfresco.activiti.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+    "id",
+    "type",
+    "value"
+})
+public class ProcessInstanceVariable {
+
+    @JsonProperty("id")
+    private String id;
+    @JsonProperty("type")
+    private String type;
+    @JsonProperty("value")
+    private Object value;
+
+    /**
+     * No args constructor for use in serialization
+     */
+    public ProcessInstanceVariable() {
+    }
+
+    public ProcessInstanceVariable(String id, String type, Object value) {
+        this.id = id;
+        this.type = type;
+        this.value = value;
+    }
+    
+    public String getId() {
+        return id;
+    }
+    
+    public void setId(String id) {
+        this.id = id;
+    }
+    
+    public ProcessInstanceVariable withId(String id) {
+        this.id = id;
+        return this;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public ProcessInstanceVariable withType(String type) {
+        this.type = type;
+        return this;
+    }
+
+    public Object getValue() {
+        return value;
+    }
+
+    public void setValue(Object value) {
+        this.value = value;
+    }
+
+    public ProcessInstanceVariable withValue(Object value) {
+        this.value = value;
+        return this;
+    }
+    
+}
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/ResultListDataRepresentation.java b/src/main/java/com/inteligr8/alfresco/activiti/model/ResultListDataRepresentation.java
index 3b47d86..ce0265d 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/model/ResultListDataRepresentation.java
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/ResultListDataRepresentation.java
@@ -2,15 +2,12 @@
 package com.inteligr8.alfresco.activiti.model;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import com.fasterxml.jackson.annotation.JsonAnyGetter;
-import com.fasterxml.jackson.annotation.JsonAnySetter;
-import com.fasterxml.jackson.annotation.JsonIgnore;
+
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.inteligr8.activiti.model.Datum;
 
 
 /**
@@ -26,7 +23,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder;
     "start",
     "total"
 })
-public class ResultListDataRepresentation<T extends Datum> {
+public class ResultListDataRepresentation<T extends Datum> extends Datum {
 
     @JsonProperty("data")
     private List<T> data = new ArrayList<>();
@@ -36,8 +33,6 @@ public class ResultListDataRepresentation<T extends Datum> {
     private Integer start;
     @JsonProperty("total")
     private Integer total;
-    @JsonIgnore
-    private Map<String, Object> additionalProperties = new HashMap<String, Object>();
 
     @JsonProperty("data")
     public List<T> getData() {
@@ -99,19 +94,4 @@ public class ResultListDataRepresentation<T extends Datum> {
         return this;
     }
 
-    @JsonAnyGetter
-    public Map<String, Object> getAdditionalProperties() {
-        return this.additionalProperties;
-    }
-
-    @JsonAnySetter
-    public void setAdditionalProperty(String name, Object value) {
-        this.additionalProperties.put(name, value);
-    }
-
-    public ResultListDataRepresentation<T> withAdditionalProperty(String name, Object value) {
-        this.additionalProperties.put(name, value);
-        return this;
-    }
-
 }
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/Task.java b/src/main/java/com/inteligr8/alfresco/activiti/model/Task.java
index 0c2b093..f94ffe0 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/model/Task.java
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/Task.java
@@ -1,12 +1,16 @@
 
 package com.inteligr8.alfresco.activiti.model;
 
+import java.time.OffsetDateTime;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonFormat.Shape;
+import com.inteligr8.activiti.model.Datum;
 
 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({
@@ -43,7 +47,7 @@ import com.fasterxml.jackson.annotation.JsonPropertyOrder;
     "taskDefinitionKey",
     "variables"
 })
-public class Task {
+public class Task extends Datum {
 
     @JsonProperty("adhocTaskCanBeReassigned")
     private Boolean adhocTaskCanBeReassigned;
@@ -52,15 +56,18 @@ public class Task {
     @JsonProperty("category")
     private String category;
     @JsonProperty("created")
-    private String created;
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime created;
     @JsonProperty("description")
     private String description;
     @JsonProperty("dueDate")
-    private String dueDate;
+    private OffsetDateTime dueDate;
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
     @JsonProperty("duration")
     private Long duration;
     @JsonProperty("endDate")
-    private String endDate;
+    private OffsetDateTime endDate;
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
     @JsonProperty("executionId")
     private String executionId;
     @JsonProperty("formKey")
@@ -155,15 +162,15 @@ public class Task {
         return this;
     }
 
-    public String getCreated() {
+    public OffsetDateTime getCreated() {
         return created;
     }
 
-    public void setCreated(String created) {
+    public void setCreated(OffsetDateTime created) {
         this.created = created;
     }
 
-    public Task withCreated(String created) {
+    public Task withCreated(OffsetDateTime created) {
         this.created = created;
         return this;
     }
@@ -181,15 +188,15 @@ public class Task {
         return this;
     }
 
-    public String getDueDate() {
+    public OffsetDateTime getDueDate() {
         return dueDate;
     }
 
-    public void setDueDate(String dueDate) {
+    public void setDueDate(OffsetDateTime dueDate) {
         this.dueDate = dueDate;
     }
 
-    public Task withDueDate(String dueDate) {
+    public Task withDueDate(OffsetDateTime dueDate) {
         this.dueDate = dueDate;
         return this;
     }
@@ -207,15 +214,15 @@ public class Task {
         return this;
     }
 
-    public String getEndDate() {
+    public OffsetDateTime getEndDate() {
         return endDate;
     }
 
-    public void setEndDate(String endDate) {
+    public void setEndDate(OffsetDateTime endDate) {
         this.endDate = endDate;
     }
 
-    public Task withEndDate(String endDate) {
+    public Task withEndDate(OffsetDateTime endDate) {
         this.endDate = endDate;
         return this;
     }
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/TaskFilter.java b/src/main/java/com/inteligr8/alfresco/activiti/model/TaskFilter.java
new file mode 100644
index 0000000..7561d9c
--- /dev/null
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/TaskFilter.java
@@ -0,0 +1,181 @@
+
+
+package com.inteligr8.alfresco.activiti.model;
+
+import java.time.OffsetDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonFormat.Shape;
+import com.inteligr8.activiti.model.Datum;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+    "name",
+    "assignment",
+    "dueAfter",
+    "dueBefore",
+    "processDefinitionId",
+    "processDefinitionKey",
+    "sort",
+    "asc",
+    "state"
+})
+public class TaskFilter extends Datum {
+    
+    public enum State {
+        @JsonProperty("all")
+        All,
+        @JsonProperty("completed")
+        Completed,
+        @JsonProperty("running")
+        Running
+    }
+
+    @JsonProperty("name")
+    private String name;
+    @JsonProperty("assignment")
+    private String assignment;
+    @JsonProperty("dueBefore")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime dueBefore;
+    @JsonProperty("dueAfter")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime dueAfter;
+    @JsonProperty("processDefinitionId")
+    private String processDefinitionId;
+    @JsonProperty("processDefinitionKey")
+    private String processDefinitionKey;
+    @JsonProperty("sort")
+    private String sort;
+    @JsonProperty("asc")
+    private Boolean asc;
+    @JsonProperty("state")
+    private State state;
+
+    /**
+     * No args constructor for use in serialization
+     */
+    public TaskFilter() {
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public TaskFilter withName(String name) {
+        this.name = name;
+        return this;
+    }
+    
+    public String getAssignment() {
+        return assignment;
+    }
+    
+    public void setAssignment(String assignment) {
+        this.assignment = assignment;
+    }
+
+    public TaskFilter withAssignment(String assignment) {
+        this.assignment = assignment;
+        return this;
+    }
+    
+    public OffsetDateTime getDueAfter() {
+        return dueAfter;
+    }
+    
+    public void setDueAfter(OffsetDateTime dueAfter) {
+        this.dueAfter = dueAfter;
+    }
+    
+    public TaskFilter withDueAfter(OffsetDateTime dueAfter) {
+        this.dueAfter = dueAfter;
+        return this;
+    }
+    
+    public OffsetDateTime getDueBefore() {
+        return dueBefore;
+    }
+    
+    public void setDueBefore(OffsetDateTime dueBefore) {
+        this.dueBefore = dueBefore;
+    }
+    
+    public TaskFilter withDueBefore(OffsetDateTime dueBefore) {
+        this.dueBefore = dueBefore;
+        return this;
+    }
+
+    public String getProcessDefinitionId() {
+        return processDefinitionId;
+    }
+
+    public void setProcessDefinitionId(String id) {
+        this.processDefinitionId = id;
+    }
+
+    public TaskFilter withProcessDefinitionId(String id) {
+        this.processDefinitionId = id;
+        return this;
+    }
+    
+    public String getProcessDefinitionKey() {
+        return processDefinitionKey;
+    }
+    
+    public void setProcessDefinitionKey(String key) {
+        this.processDefinitionKey = key;
+    }
+    
+    public TaskFilter withProcessDefinitionKey(String key) {
+        this.processDefinitionKey = key;
+        return this;
+    }
+    
+    public String getSort() {
+        return sort;
+    }
+    
+    public void setSort(String sort) {
+        this.sort = sort;
+    }
+    
+    public TaskFilter withSort(String sort) {
+        this.sort = sort;
+        return this;
+    }
+    
+    public Boolean isAsc() {
+        return asc;
+    }
+    
+    public void setAsc(Boolean asc) {
+        this.asc = asc;
+    }
+    
+    public TaskFilter withAsc(Boolean asc) {
+        this.asc = asc;
+        return this;
+    }
+    
+    public State getState() {
+        return state;
+    }
+    
+    public void setState(State state) {
+        this.state = state;
+    }
+    
+    public TaskFilter withState(State state) {
+        this.state = state;
+        return this;
+    }
+
+}
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/TaskFilterRepresentation.java b/src/main/java/com/inteligr8/alfresco/activiti/model/TaskFilterRepresentation.java
new file mode 100644
index 0000000..2b4f73c
--- /dev/null
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/TaskFilterRepresentation.java
@@ -0,0 +1,101 @@
+
+
+package com.inteligr8.alfresco.activiti.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+    "filterId",
+    "filter",
+    "appDefinitionId",
+    "page",
+    "size"
+})
+public class TaskFilterRepresentation {
+
+    @JsonProperty("filterId")
+    private Long filterId;
+    @JsonProperty("filter")
+    private TaskFilter filter;
+    @JsonProperty("appDefinitionId")
+    private Long appDefinitionId;
+    @JsonProperty("page")
+    private Integer page;
+    @JsonProperty("size")
+    private Integer size;
+
+    /**
+     * No args constructor for use in serialization
+     */
+    public TaskFilterRepresentation() {
+    }
+    
+    public Long getFilterId() {
+        return filterId;
+    }
+    
+    public void setFilterId(Long filterId) {
+        this.filterId = filterId;
+    }
+    
+    public TaskFilterRepresentation withFilterId(Long filterId) {
+        this.filterId = filterId;
+        return this;
+    }
+    
+    public TaskFilter getFilter() {
+        return filter;
+    }
+    
+    public void setFilter(TaskFilter filter) {
+        this.filter = filter;
+    }
+    
+    public TaskFilterRepresentation withFilter(TaskFilter filter) {
+        this.filter = filter;
+        return this;
+    }
+
+    public Long getAppDefinitionId() {
+        return appDefinitionId;
+    }
+
+    public void setAppDefinitionId(Long appDefinitionId) {
+        this.appDefinitionId = appDefinitionId;
+    }
+
+    public TaskFilterRepresentation withAppDefinitionId(Long appDefinitionId) {
+        this.appDefinitionId = appDefinitionId;
+        return this;
+    }
+    
+    public Integer getPage() {
+        return page;
+    }
+    
+    public void setPage(Integer page) {
+        this.page = page;
+    }
+    
+    public TaskFilterRepresentation withPage(Integer page) {
+        this.page = page;
+        return this;
+    }
+
+    public Integer getSize() {
+        return size;
+    }
+
+    public void setSize(Integer size) {
+        this.size = size;
+    }
+
+    public TaskFilterRepresentation withSize(Integer size) {
+        this.size = size;
+        return this;
+    }
+
+}
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/TaskQueryRepresentation.java b/src/main/java/com/inteligr8/alfresco/activiti/model/TaskQueryRepresentation.java
new file mode 100644
index 0000000..05bf318
--- /dev/null
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/TaskQueryRepresentation.java
@@ -0,0 +1,243 @@
+
+
+package com.inteligr8.alfresco.activiti.model;
+
+import java.time.OffsetDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonFormat.Shape;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+@JsonPropertyOrder({
+    "text",
+    "assignment",
+    "taskId",
+    "dueAfter",
+    "dueBefore",
+    "processInstanceId",
+    "processDefinitionId",
+    "appDefinitionId",
+    "includeProcessInstance",
+    "includeProcessVariables",
+    "includeTaskLocalVariables",
+    "page",
+    "size",
+    "sort",
+    "start",
+    "state"
+})
+public class TaskQueryRepresentation {
+    
+    public enum Sort {
+        @JsonProperty("created-asc")
+        CreatedAsc,
+        @JsonProperty("created-desc")
+        CreatedDesc,
+        @JsonProperty("due-asc")
+        DueAsc,
+        @JsonProperty("due-desc")
+        DueDesc,
+    }
+    
+    public enum State {
+        @JsonProperty("all")
+        All,
+        @JsonProperty("completed")
+        Completed,
+        @JsonProperty("active")
+        Active
+    }
+
+    @JsonProperty("text")
+    private String text;
+    @JsonProperty("dueBefore")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime dueBefore;
+    @JsonProperty("dueAfter")
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime dueAfter;
+    @JsonProperty("taskId")
+    private String taskId;
+    @JsonProperty("processInstanceId")
+    private String processInstanceId;
+    @JsonProperty("processDefinitionId")
+    private String processDefinitionId;
+    @JsonProperty("appDefinitionId")
+    private Long appDefinitionId;
+    @JsonProperty("page")
+    private Integer page;
+    @JsonProperty("size")
+    private Integer size;
+    @JsonProperty("sort")
+    private Sort sort;
+    @JsonProperty("start")
+    private Integer start;
+    @JsonProperty("state")
+    private State state;
+
+    /**
+     * No args constructor for use in serialization
+     */
+    public TaskQueryRepresentation() {
+    }
+    
+    public String getText() {
+        return text;
+    }
+    
+    public void setText(String text) {
+        this.text = text;
+    }
+    
+    public TaskQueryRepresentation withText(String text) {
+        this.text = text;
+        return this;
+    }
+    
+    public OffsetDateTime getDueAfter() {
+        return dueAfter;
+    }
+    
+    public void setDueAfter(OffsetDateTime dueAfter) {
+        this.dueAfter = dueAfter;
+    }
+    
+    public TaskQueryRepresentation withDueAfter(OffsetDateTime dueAfter) {
+        this.dueAfter = dueAfter;
+        return this;
+    }
+    
+    public OffsetDateTime getDueBefore() {
+        return dueBefore;
+    }
+    
+    public void setDueBefore(OffsetDateTime dueBefore) {
+        this.dueBefore = dueBefore;
+    }
+    
+    public TaskQueryRepresentation withDueBefore(OffsetDateTime dueBefore) {
+        this.dueBefore = dueBefore;
+        return this;
+    }
+    
+    public String getTaskId() {
+        return taskId;
+    }
+    
+    public void setTaskId(String taskId) {
+        this.taskId = taskId;
+    }
+    
+    public TaskQueryRepresentation withTaskId(String taskId) {
+        this.taskId = taskId;
+        return this;
+    }
+
+    public Long getAppDefinitionId() {
+        return appDefinitionId;
+    }
+
+    public void setAppDefinitionId(Long appDefinitionId) {
+        this.appDefinitionId = appDefinitionId;
+    }
+
+    public TaskQueryRepresentation withAppDefinitionId(Long appDefinitionId) {
+        this.appDefinitionId = appDefinitionId;
+        return this;
+    }
+
+    public String getProcessDefinitionId() {
+        return processDefinitionId;
+    }
+
+    public void setProcessDefinitionId(String processDefinitionId) {
+        this.processDefinitionId = processDefinitionId;
+    }
+
+    public TaskQueryRepresentation withProcessDefinitionId(String processDefinitionId) {
+        this.processDefinitionId = processDefinitionId;
+        return this;
+    }
+
+    public String getProcessInstanceId() {
+        return processInstanceId;
+    }
+
+    public void setProcessInstanceId(String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+    }
+
+    public TaskQueryRepresentation withProcessInstanceId(String processInstanceId) {
+        this.processInstanceId = processInstanceId;
+        return this;
+    }
+    
+    public Integer getPage() {
+        return page;
+    }
+    
+    public void setPage(Integer page) {
+        this.page = page;
+    }
+    
+    public TaskQueryRepresentation withPage(Integer page) {
+        this.page = page;
+        return this;
+    }
+
+    public Integer getSize() {
+        return size;
+    }
+
+    public void setSize(Integer size) {
+        this.size = size;
+    }
+
+    public TaskQueryRepresentation withSize(Integer size) {
+        this.size = size;
+        return this;
+    }
+
+    public Sort getSort() {
+        return sort;
+    }
+
+    public void setSort(Sort sort) {
+        this.sort = sort;
+    }
+
+    public TaskQueryRepresentation withSort(Sort sort) {
+        this.sort = sort;
+        return this;
+    }
+
+    public Integer getStart() {
+        return start;
+    }
+
+    public void setStart(Integer start) {
+        this.start = start;
+    }
+
+    public TaskQueryRepresentation withStart(Integer start) {
+        this.start = start;
+        return this;
+    }
+    
+    public State getState() {
+        return state;
+    }
+    
+    public void setState(State state) {
+        this.state = state;
+    }
+    
+    public TaskQueryRepresentation withState(State state) {
+        this.state = state;
+        return this;
+    }
+
+}
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/TaskUpdate.java b/src/main/java/com/inteligr8/alfresco/activiti/model/TaskUpdate.java
index 32a2d92..708c725 100644
--- a/src/main/java/com/inteligr8/alfresco/activiti/model/TaskUpdate.java
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/TaskUpdate.java
@@ -1,9 +1,13 @@
 
 package com.inteligr8.alfresco.activiti.model;
 
+import java.time.OffsetDateTime;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonFormat.Shape;
 
 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({
@@ -33,7 +37,8 @@ public class TaskUpdate {
     @JsonProperty("descriptionSet")
     private Boolean descriptionSet;
     @JsonProperty("dueDate")
-    private String dueDate;
+    @JsonFormat(shape = Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX")
+    private OffsetDateTime dueDate;
     @JsonProperty("dueDateSet")
     private Boolean dueDateSet;
     @JsonProperty("formKey")
@@ -111,15 +116,15 @@ public class TaskUpdate {
         return this;
     }
 
-    public String getDueDate() {
+    public OffsetDateTime getDueDate() {
         return dueDate;
     }
 
-    public void setDueDate(String dueDate) {
+    public void setDueDate(OffsetDateTime dueDate) {
         this.dueDate = dueDate;
     }
 
-    public TaskUpdate withDueDate(String dueDate) {
+    public TaskUpdate withDueDate(OffsetDateTime dueDate) {
         this.dueDate = dueDate;
         return this;
     }
diff --git a/src/main/java/com/inteligr8/alfresco/activiti/model/UserIdentifier.java b/src/main/java/com/inteligr8/alfresco/activiti/model/UserIdentifier.java
new file mode 100644
index 0000000..36c2f0c
--- /dev/null
+++ b/src/main/java/com/inteligr8/alfresco/activiti/model/UserIdentifier.java
@@ -0,0 +1,42 @@
+package com.inteligr8.alfresco.activiti.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class UserIdentifier {
+	
+	@JsonProperty
+	private String userId;
+	@JsonProperty
+	private String email;
+	
+    public String getUserId() {
+        return userId;
+    }
+    
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+	public UserIdentifier withUserId(String userId) {
+        this.userId = userId;
+        return this;
+    }
+    
+    public String getEmail() {
+        return email;
+    }
+    
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+	public UserIdentifier withEmail(String email) {
+        this.email = email;
+        return this;
+    }
+
+}