diff --git a/persistence-service-v1/persistence-service-api-v1/pom.xml b/persistence-service-v1/persistence-service-api-v1/pom.xml
index d4a7bc4fb..fb329153b 100644
--- a/persistence-service-v1/persistence-service-api-v1/pom.xml
+++ b/persistence-service-v1/persistence-service-api-v1/pom.xml
@@ -50,6 +50,18 @@
com.iqser.red.commons
jackson-commons
+
+ org.hibernate
+ hibernate-core
+ 5.4.28.Final
+ compile
+
+
+ org.springframework.data
+ spring-data-commons
+ 2.4.5
+ compile
+
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/AddNotificationRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/AddNotificationRequest.java
new file mode 100644
index 000000000..287781c63
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/AddNotificationRequest.java
@@ -0,0 +1,24 @@
+package com.iqser.red.service.persistence.service.v1.api.model.data.audit;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AddNotificationRequest {
+
+ private String userId;
+ private String issuerId;
+ private String notificationType;
+
+ @Builder.Default
+ private Map target = new HashMap<>();
+
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/AuditModel.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/AuditModel.java
new file mode 100644
index 000000000..233103a1f
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/AuditModel.java
@@ -0,0 +1,41 @@
+package com.iqser.red.service.persistence.service.v1.api.model.data.audit;
+
+import com.iqser.red.service.persistence.service.v1.api.utils.JSONConverter;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.time.OffsetDateTime;
+import java.util.Map;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity
+@Table(name="audit")
+public class AuditModel {
+
+ @Id
+ @GeneratedValue
+ private long recordId;
+
+ @Column
+ private OffsetDateTime recordDate;
+
+ @Column
+ private String objectId;
+ @Column
+ private String category;
+ @Column
+ private String userId;
+ @Column
+ private String message;
+
+ @Convert(converter = JSONConverter.class)
+ @Column(columnDefinition = "json")
+ private Map details;
+
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/AuditRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/AuditRequest.java
new file mode 100644
index 000000000..16b6318df
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/AuditRequest.java
@@ -0,0 +1,27 @@
+package com.iqser.red.service.persistence.service.v1.api.model.data.audit;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class AuditRequest {
+
+ private String objectId;
+ private String category;
+ private String userId;
+
+ private String message;
+
+ @Builder.Default
+ private Map details = new HashMap<>();
+
+
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/AuditSearchRequest.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/AuditSearchRequest.java
new file mode 100644
index 000000000..c6d637247
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/AuditSearchRequest.java
@@ -0,0 +1,21 @@
+package com.iqser.red.service.persistence.service.v1.api.model.data.audit;
+
+import lombok.Data;
+
+import java.time.OffsetDateTime;
+
+@Data
+public class AuditSearchRequest {
+
+ private String category;
+ private String userId;
+ private String objectId;
+ private String requestingUserId;
+
+ private OffsetDateTime from;
+ private OffsetDateTime to;
+
+ private int page;
+ private int pageSize;
+
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/CategoryModel.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/CategoryModel.java
new file mode 100644
index 000000000..3d23a2d63
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/audit/CategoryModel.java
@@ -0,0 +1,8 @@
+package com.iqser.red.service.persistence.service.v1.api.model.data.audit;
+
+public interface CategoryModel {
+
+ String getCategory();
+
+ long getRecordCount();
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/notification/Notification.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/notification/Notification.java
new file mode 100644
index 000000000..e977c6c62
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/model/data/notification/Notification.java
@@ -0,0 +1,53 @@
+package com.iqser.red.service.persistence.service.v1.api.model.data.notification;
+
+import com.iqser.red.service.persistence.service.v1.api.utils.JSONConverter;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.TypeDef;
+
+import javax.persistence.*;
+import java.time.OffsetDateTime;
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+@NoArgsConstructor
+@Entity
+@Table(name = "notification")
+public class Notification {
+
+ @Id
+ @GeneratedValue
+ private long id;
+
+ @Column
+ private String userId;
+
+ @Column
+ private String notificationType;
+
+ @Column
+ private String issuerId;
+
+ @Column
+ private OffsetDateTime creationDate;
+
+ @Column
+ private OffsetDateTime seenDate;
+
+ @Column
+ private OffsetDateTime readDate;
+
+ @Column
+ private OffsetDateTime softDeleted;
+
+ @Column
+ private String notificationDetails;
+
+ @Convert(converter = JSONConverter.class)
+ @Column(columnDefinition = "json")
+ private Map target = new HashMap<>();
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/AuditResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/AuditResource.java
new file mode 100644
index 000000000..5f09829f4
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/AuditResource.java
@@ -0,0 +1,37 @@
+package com.iqser.red.service.persistence.service.v1.api.resources;
+
+import com.iqser.red.service.persistence.service.v1.api.model.data.audit.AuditModel;
+import com.iqser.red.service.persistence.service.v1.api.model.data.audit.AuditRequest;
+import com.iqser.red.service.persistence.service.v1.api.model.data.audit.AuditSearchRequest;
+import com.iqser.red.service.persistence.service.v1.api.model.data.audit.CategoryModel;
+import org.springframework.data.domain.Page;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+public interface AuditResource {
+
+ String PATH = "/audit";
+
+ /**
+ * @param auditRequest - details to audit
+ * @throws org.springframework.web.server.ResponseStatusException - 404 - Not Found in case the object doesn't exist
+ */
+ @ResponseBody
+ @ResponseStatus(value = HttpStatus.OK)
+ @PostMapping(value = PATH, consumes = MediaType.APPLICATION_JSON_VALUE)
+ void audit(@RequestBody AuditRequest auditRequest);
+
+ @ResponseBody
+ @ResponseStatus(value = HttpStatus.OK)
+ @PostMapping(value = PATH + "/search", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
+ Page search(@RequestBody AuditSearchRequest auditSearchRequest);
+
+ @ResponseBody
+ @ResponseStatus(value = HttpStatus.OK)
+ @GetMapping(value = PATH + "/categories", produces = MediaType.APPLICATION_JSON_VALUE)
+ List getCategories();
+
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationResource.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationResource.java
new file mode 100644
index 000000000..883760d2f
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/resources/NotificationResource.java
@@ -0,0 +1,50 @@
+package com.iqser.red.service.persistence.service.v1.api.resources;
+
+import com.iqser.red.service.persistence.service.v1.api.model.data.audit.AddNotificationRequest;
+import com.iqser.red.service.persistence.service.v1.api.model.data.notification.Notification;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@ResponseStatus(value = HttpStatus.OK)
+public interface NotificationResource {
+
+ String NOTIFICATION_PATH = "/notification";
+ String TOGGLE_SEEN_PATH = "/toggle-seen";
+ String TOGGLE_READ_PATH = "/toggle-read";
+
+ String USER_ID_PARAM = "userId";
+ String USER_ID_PATH_PARAM = "/{" + USER_ID_PARAM + "}";
+
+ String INCLUDE_SEEN_PARAM = "includeSeen";
+ String SET_SEEN_PARAM = "setSeen";
+ String SET_READ_PARAM = "setRead";
+
+
+ @PostMapping(value = NOTIFICATION_PATH, consumes = MediaType.APPLICATION_JSON_VALUE)
+ void addNotification(@RequestBody AddNotificationRequest addNotificationRequest);
+
+
+ @PostMapping(value = NOTIFICATION_PATH + TOGGLE_SEEN_PATH + USER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE)
+ void toggleSeen(@PathVariable(USER_ID_PARAM) String userId, @RequestBody List notificationIds,
+ @RequestParam(SET_SEEN_PARAM) boolean setSeen);
+
+
+ @PostMapping(value = NOTIFICATION_PATH + TOGGLE_READ_PATH + USER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE)
+ void toggleRead(@PathVariable(USER_ID_PARAM) String userId, @RequestBody List notificationIds,
+ @RequestParam(SET_READ_PARAM) boolean setRead);
+
+
+ @DeleteMapping(value = NOTIFICATION_PATH + USER_ID_PATH_PARAM, consumes = MediaType.APPLICATION_JSON_VALUE)
+ void softDelete(@PathVariable(USER_ID_PARAM) String userId, @RequestBody List notificationIds);
+
+
+ @ResponseBody
+ @ResponseStatus(value = HttpStatus.OK)
+ @GetMapping(value = NOTIFICATION_PATH + USER_ID_PATH_PARAM, produces = MediaType.APPLICATION_JSON_VALUE)
+ List getNotifications(@PathVariable(USER_ID_PARAM) String userId,
+ @RequestParam(INCLUDE_SEEN_PARAM) boolean includeSeen);
+
+}
diff --git a/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/utils/JSONConverter.java b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/utils/JSONConverter.java
new file mode 100644
index 000000000..ebc4c6c37
--- /dev/null
+++ b/persistence-service-v1/persistence-service-api-v1/src/main/java/com/iqser/red/service/persistence/service/v1/api/utils/JSONConverter.java
@@ -0,0 +1,27 @@
+package com.iqser.red.service.persistence.service.v1.api.utils;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.SneakyThrows;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+import java.util.Map;
+
+@Converter(autoApply = true)
+public class JSONConverter implements AttributeConverter