From e812fd56b89812140283b6f4a35261acdfeccebf Mon Sep 17 00:00:00 2001
From: RIHTARSIC Joze <joze.rihtarsic@ext.ec.europa.eu>
Date: Thu, 27 Apr 2023 07:34:16 +0200
Subject: [PATCH] enable back alerts

---
 .../edelivery/smp/data/dao/CredentialDao.java | 127 ++++-----
 .../ec/edelivery/smp/data/dao/QueryNames.java |   6 +
 .../ec/edelivery/smp/data/dao/UserDao.java    |  33 +--
 .../ec/edelivery/smp/data/model/DBAlert.java  |   5 +-
 .../smp/data/model/user/DBCredential.java     |  84 ++----
 .../edelivery/smp/data/model/user/DBUser.java |  88 ++++---
 .../smp/services/CredentialService.java       |   9 +-
 .../services/CredentialValidatorService.java  |  35 +--
 .../smp/services/CredentialsAlertService.java | 246 +++++++-----------
 .../smp/data/dao/CredentialDaoAlertsTest.java | 213 +++++++++++++++
 .../smp/data/dao/UserDaoAlertsTest.java       | 180 -------------
 .../smp/services/AlertServiceTest.java        |  18 +-
 .../CredentialValidatorServiceTest.java       |  79 +++---
 .../edelivery/smp/testutil/TestDBUtils.java   |  25 +-
 14 files changed, 530 insertions(+), 618 deletions(-)
 create mode 100644 smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/CredentialDaoAlertsTest.java
 delete mode 100644 smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/UserDaoAlertsTest.java

diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/CredentialDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/CredentialDao.java
index d2ed00ff2..858c541d7 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/CredentialDao.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/CredentialDao.java
@@ -43,9 +43,9 @@ import static eu.europa.ec.edelivery.smp.exceptions.ErrorCode.ILLEGAL_STATE_USER
 @Repository
 public class CredentialDao extends BaseDao<DBCredential> {
     private static final SMPLogger LOG = SMPLoggerFactory.getLogger(CredentialDao.class);
-    private static final String QUERY_PARAM_ALERT_CREDENTIAL_START_DATE = "startAlertDate";
+    private static final String QUERY_PARAM_ALERT_CREDENTIAL_START_ALERT_SEND_DATE = "start_alert_send_date";
     private static final String QUERY_PARAM_ALERT_CREDENTIAL_END_DATE = "endAlertDate";
-    private static final String QUERY_PARAM_ALERT_CREDENTIAL_EXPIRE_DATE = "expireDate";
+    private static final String QUERY_PARAM_ALERT_CREDENTIAL_EXPIRE_TEST_DATE = "expire_test_date";
     private static final String QUERY_PARAM_ALERT_CREDENTIAL_LAST_ALERT_DATE = "lastSendAlertDate";
 
 
@@ -188,86 +188,74 @@ public class CredentialDao extends BaseDao<DBCredential> {
         }
     }
 
+    /**
+     * Get users with credentials which are about to expire, and they were not yet notified in alertInterval period
+     * @param credentialType - the credential type to send alert
+     * @param beforeStartDays - days before password is expired and the alerting starts
+     * @param alertInterval - how many days must past since last alert before we can send next alert
+     * @param maxAlertsInBatch - max number of alerts we can process in on batch
+     * @return
+     */
+    public List<DBCredential> getCredentialsBeforeExpireForAlerts(CredentialType credentialType, int beforeStartDays, int alertInterval, int maxAlertsInBatch) {
 
-    public List<DBUser> getBeforePasswordExpireUsersForAlerts(int beforeStartDays, int alertInterval, int maxAlertsInBatch) {
-        OffsetDateTime expireDate = OffsetDateTime.now();
-        OffsetDateTime startDateTime = expireDate.plusDays(beforeStartDays);
-        OffsetDateTime lastSendAlertDate = expireDate.minusDays(alertInterval);
+        OffsetDateTime expireTestDate = OffsetDateTime.now();
+        OffsetDateTime startAlertSendDate = expireTestDate.plusDays(beforeStartDays);
+        OffsetDateTime lastSendAlertDate = expireTestDate.minusDays(alertInterval);
 
-        TypedQuery<DBUser> query = memEManager.createNamedQuery("DBUser.getUsersForBeforePasswordExpireAlerts", DBUser.class);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_START_DATE, startDateTime);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_EXPIRE_DATE, expireDate);
+        TypedQuery<DBCredential> query = memEManager.createNamedQuery(QUERY_CREDENTIAL_BEFORE_EXPIRE, DBCredential.class);
+
+        query.setParameter(PARAM_CREDENTIAL_TYPE, credentialType );
+        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_START_ALERT_SEND_DATE, startAlertSendDate);
+        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_EXPIRE_TEST_DATE, expireTestDate);
         query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_LAST_ALERT_DATE, lastSendAlertDate);
         query.setMaxResults(maxAlertsInBatch);
         return query.getResultList();
     }
-
-    public List<DBUser> getPasswordExpiredUsersForAlerts(int alertPeriodDays, int alertInterval, int maxAlertsInBatch) {
+    /**
+     * Get users with passwords which are about to expire, and they were not yet notified in alertInterval period
+     * @param credentialType - the credential type to send alert
+     * @param alertPeriodDays - days before password is expired and the alerting starts
+     * @param alertInterval - how many days must past since last alert before we can send next alert
+     * @param maxAlertsInBatch - max number of alerts we can process in on batch
+     * @return
+     */
+    public List<DBCredential> getUsersWithExpiredCredentialsForAlerts(CredentialType credentialType, int alertPeriodDays, int alertInterval, int maxAlertsInBatch) {
         OffsetDateTime expireDate = OffsetDateTime.now();
-        // the alert period must be less then expire day
+        // the alert period must be less than expire day
         OffsetDateTime startDateTime = expireDate.minusDays(alertPeriodDays);
         OffsetDateTime lastSendAlertDate = expireDate.minusDays(alertInterval);
 
-        TypedQuery<DBUser> query = memEManager.createNamedQuery("DBUser.getUsersForPasswordExpiredAlerts", DBUser.class);
+        TypedQuery<DBCredential> query = memEManager.createNamedQuery(QUERY_CREDENTIAL_EXPIRED, DBCredential.class);
+        query.setParameter(PARAM_CREDENTIAL_TYPE, credentialType );
         query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_END_DATE, startDateTime);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_EXPIRE_DATE, expireDate);
+        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_EXPIRE_TEST_DATE, expireDate);
         query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_LAST_ALERT_DATE, lastSendAlertDate);
         query.setMaxResults(maxAlertsInBatch);
         return query.getResultList();
     }
 
-    public List<DBUser> getBeforeAccessTokenExpireUsersForAlerts(int beforeStartDays, int alertInterval, int maxAlertsInBatch) {
-        OffsetDateTime expireDate = OffsetDateTime.now();
-        OffsetDateTime startDateTime = expireDate.plusDays(beforeStartDays);
-        OffsetDateTime lastSendAlertDate = expireDate.minusDays(alertInterval);
-
-        TypedQuery<DBUser> query = memEManager.createNamedQuery("DBUser.getUsersForBeforeAccessTokenExpireAlerts", DBUser.class);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_START_DATE, startDateTime);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_EXPIRE_DATE, expireDate);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_LAST_ALERT_DATE, lastSendAlertDate);
-        query.setMaxResults(maxAlertsInBatch);
-        return query.getResultList();
+    public List<DBCredential> getBeforePasswordExpireUsersForAlerts(int beforeStartDays, int alertInterval, int maxAlertsInBatch) {
+        return getCredentialsBeforeExpireForAlerts(CredentialType.USERNAME_PASSWORD, beforeStartDays, alertInterval, maxAlertsInBatch);
     }
 
-    public List<DBUser> getAccessTokenExpiredUsersForAlerts(int alertPeriodDays, int alertInterval, int maxAlertsInBatch) {
-        OffsetDateTime expireDate = OffsetDateTime.now();
-        // the alert period must be less then expire day
-        OffsetDateTime startDateTime = expireDate.minusDays(alertPeriodDays);
-        OffsetDateTime lastSendAlertDate = expireDate.minusDays(alertInterval);
-
-        TypedQuery<DBUser> query = memEManager.createNamedQuery("DBUser.getUsersForAccessTokenExpiredAlerts", DBUser.class);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_END_DATE, startDateTime);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_EXPIRE_DATE, expireDate);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_LAST_ALERT_DATE, lastSendAlertDate);
-        query.setMaxResults(maxAlertsInBatch);
-        return query.getResultList();
+    public List<DBCredential> getPasswordExpiredUsersForAlerts(int alertPeriodDays, int alertInterval, int maxAlertsInBatch) {
+        return getUsersWithExpiredCredentialsForAlerts(CredentialType.USERNAME_PASSWORD, alertPeriodDays, alertInterval, maxAlertsInBatch);
     }
 
-    public List<DBUser> getBeforeCertificateExpireUsersForAlerts(int beforeStartDays, int alertInterval, int maxAlertsInBatch) {
-        OffsetDateTime expireDate = OffsetDateTime.now();
-        OffsetDateTime startDateTime = expireDate.plusDays(beforeStartDays);
-        OffsetDateTime lastSendAlertDate = expireDate.minusDays(alertInterval);
+    public List<DBCredential> getBeforeAccessTokenExpireUsersForAlerts(int beforeStartDays, int alertInterval, int maxAlertsInBatch) {
+        return getCredentialsBeforeExpireForAlerts(CredentialType.ACCESS_TOKEN, beforeStartDays, alertInterval, maxAlertsInBatch);
+    }
 
-        TypedQuery<DBUser> query = memEManager.createNamedQuery("DBUser.getUsersForBeforeCertificateExpireAlerts", DBUser.class);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_START_DATE, startDateTime);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_EXPIRE_DATE, expireDate);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_LAST_ALERT_DATE, lastSendAlertDate);
-        query.setMaxResults(maxAlertsInBatch);
-        return query.getResultList();
+    public List<DBCredential> getAccessTokenExpiredUsersForAlerts(int alertPeriodDays, int alertInterval, int maxAlertsInBatch) {
+        return getUsersWithExpiredCredentialsForAlerts(CredentialType.ACCESS_TOKEN, alertPeriodDays, alertInterval, maxAlertsInBatch);
     }
 
-    public List<DBUser> getCertificateExpiredUsersForAlerts(int alertPeriodDays, int alertInterval, int maxAlertsInBatch) {
-        OffsetDateTime expireDate = OffsetDateTime.now();
-        // the alert period must be less then expire day
-        OffsetDateTime startDateTime = expireDate.minusDays(alertPeriodDays);
-        OffsetDateTime lastSendAlertDate = expireDate.minusDays(alertInterval);
+    public List<DBCredential> getBeforeCertificateExpireUsersForAlerts(int beforeStartDays, int alertInterval, int maxAlertsInBatch) {
+        return getCredentialsBeforeExpireForAlerts(CredentialType.CERTIFICATE, beforeStartDays, alertInterval, maxAlertsInBatch);
+    }
 
-        TypedQuery<DBUser> query = memEManager.createNamedQuery("DBUser.getUsersForCertificateExpiredAlerts", DBUser.class);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_END_DATE, startDateTime);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_EXPIRE_DATE, expireDate);
-        query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_LAST_ALERT_DATE, lastSendAlertDate);
-        query.setMaxResults(maxAlertsInBatch);
-        return query.getResultList();
+    public List<DBCredential> getCertificateExpiredUsersForAlerts(int alertPeriodDays, int alertInterval, int maxAlertsInBatch) {
+        return getUsersWithExpiredCredentialsForAlerts(CredentialType.CERTIFICATE, alertPeriodDays, alertInterval, maxAlertsInBatch);
     }
 
     /**
@@ -316,25 +304,10 @@ public class CredentialDao extends BaseDao<DBCredential> {
     }
 
     @Transactional
-    public void updateAlertSentForUserCredentials(Long userId, CredentialType credentialType, OffsetDateTime dateTime) {
-        /*
-        DBUser user = find(userId);
-        switch (credentialType) {
-            case USERNAME_PASSWORD:
-                user.setPasswordExpireAlertOn(dateTime);
-                break;
-            case ACCESS_TOKEN:
-                user.setAccessTokenExpireAlertOn(dateTime);
-                break;
-            case CERTIFICATE:
-                /*if (user.getCertificate() == null) {
-                    LOG.warn("Can not set certificate alert sent date for user [{}] without certificate!", user.getUsername());
-                } else {
-                    user.getCertificate().setCertificateLastExpireAlertOn(dateTime);
-                }* /
-                break;
-        }
-        */
+    public void updateAlertSentForUserCredentials(DBCredential credential,  OffsetDateTime dateTime) {
+        // attach to jpa session of not already
+        DBCredential managedCredential = find(credential.getId());
+        managedCredential.setExpireAlertOn(dateTime);
     }
 
 
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/QueryNames.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/QueryNames.java
index bae9ceb41..10e4c77d6 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/QueryNames.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/QueryNames.java
@@ -120,6 +120,12 @@ public class QueryNames {
     public static final String QUERY_USER_FILTER_COUNT = "DBUser.getUsersByFilterCount";
     public static final String QUERY_USERS = "DBUser.getUsers";
     public static final String QUERY_QUERY_USERS_FILTER = "DBUser.getUsersByFilter";
+    // ALERTS
+    public static final String QUERY_USER_BEFORE_PASSWORD_EXPIRE = "DBUser.getUsersForBeforePasswordExpireAlerts";
+    public static final String QUERY_USER_WITH_PASSWORD_EXPIRED =  "DBUser.getUsersForPasswordExpiredAlerts";
+
+    public static final String QUERY_CREDENTIAL_BEFORE_EXPIRE = "DBCredential.getCredentialBeforeExpireAlerts";
+    public static final String QUERY_CREDENTIAL_EXPIRED =  "DBCredential.getCredentiaExpiredAlerts";
 
 
     public static final String PARAM_NAME = "name";
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/UserDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/UserDao.java
index 8bb831c97..23615e6ed 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/UserDao.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/UserDao.java
@@ -16,6 +16,7 @@ package eu.europa.ec.edelivery.smp.data.dao;
 import eu.europa.ec.edelivery.smp.data.enums.CredentialTargetType;
 import eu.europa.ec.edelivery.smp.data.enums.CredentialType;
 import eu.europa.ec.edelivery.smp.data.model.DBUserDeleteValidation;
+import eu.europa.ec.edelivery.smp.data.model.user.DBCredential;
 import eu.europa.ec.edelivery.smp.data.model.user.DBUser;
 import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException;
 import eu.europa.ec.edelivery.smp.logging.SMPLogger;
@@ -200,13 +201,14 @@ public class UserDao extends BaseDao<DBUser> {
             throw new SMPRuntimeException(ILLEGAL_STATE_USERNAME_MULTIPLE_ENTRY, username);
         }
     }
-
+/*
     public List<DBUser> getBeforePasswordExpireUsersForAlerts(int beforeStartDays, int alertInterval, int maxAlertsInBatch) {
         OffsetDateTime expireDate = OffsetDateTime.now();
         OffsetDateTime startDateTime = expireDate.plusDays(beforeStartDays);
         OffsetDateTime lastSendAlertDate = expireDate.minusDays(alertInterval);
 
-        TypedQuery<DBUser> query = memEManager.createNamedQuery("DBUser.getUsersForBeforePasswordExpireAlerts", DBUser.class);
+        TypedQuery<DBUser> query = memEManager.createNamedQuery(QUERY_USER_BEFORE_PASSWORD_EXPIRE, DBUser.class);
+        query.setParameter(PARAM_CREDENTIAL_TYPE, CredentialType.USERNAME_PASSWORD );
         query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_START_DATE, startDateTime);
         query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_EXPIRE_DATE, expireDate);
         query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_LAST_ALERT_DATE, lastSendAlertDate);
@@ -220,7 +222,8 @@ public class UserDao extends BaseDao<DBUser> {
         OffsetDateTime startDateTime = expireDate.minusDays(alertPeriodDays);
         OffsetDateTime lastSendAlertDate = expireDate.minusDays(alertInterval);
 
-        TypedQuery<DBUser> query = memEManager.createNamedQuery("DBUser.getUsersForPasswordExpiredAlerts", DBUser.class);
+        TypedQuery<DBUser> query = memEManager.createNamedQuery(QUERY_USER_WITH_PASSWORD_EXPIRED, DBUser.class);
+        query.setParameter(PARAM_CREDENTIAL_TYPE, CredentialType.USERNAME_PASSWORD );
         query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_END_DATE, startDateTime);
         query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_EXPIRE_DATE, expireDate);
         query.setParameter(QUERY_PARAM_ALERT_CREDENTIAL_LAST_ALERT_DATE, lastSendAlertDate);
@@ -281,7 +284,7 @@ public class UserDao extends BaseDao<DBUser> {
         query.setMaxResults(maxAlertsInBatch);
         return query.getResultList();
     }
-
+*/
     /**
      * Validation report for users which owns service group
      *
@@ -295,28 +298,6 @@ public class UserDao extends BaseDao<DBUser> {
         return query.getResultList();
     }
 
-    @Transactional
-    public void updateAlertSentForUserCredentials(Long userId, CredentialType credentialType, OffsetDateTime dateTime) {
-        DBUser user = find(userId);
-        /*
-        switch (credentialType) {
-            case USERNAME_PASSWORD:
-                user.setPasswordExpireAlertOn(dateTime);
-                break;
-            case ACCESS_TOKEN:
-                user.setAccessTokenExpireAlertOn(dateTime);
-                break;
-            case CERTIFICATE:
-                / *if (user.getCertificate() == null) {
-                    LOG.warn("Can not set certificate alert sent date for user [{}] without certificate!", user.getUsername());
-                } else {
-                    user.getCertificate().setCertificateLastExpireAlertOn(dateTime);
-                }* /
-                break;
-        }
-        */
-    }
-
     public List<DBUser> getFilteredUserList(int iPage, int iPageSize, String filter) {
         boolean hasFilter = StringUtils.isNotBlank(filter);
         TypedQuery<DBUser> query = memEManager.createNamedQuery(hasFilter ?
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBAlert.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBAlert.java
index 025572309..49370b4fc 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBAlert.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBAlert.java
@@ -12,7 +12,6 @@ import javax.validation.constraints.NotNull;
 import java.time.OffsetDateTime;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Objects;
 
 /**
  * Database table containing update data
@@ -49,7 +48,7 @@ public class DBAlert extends BaseEntity {
     @NotNull
     private AlertStatusEnum alertStatus;
 
-    @Column(name = "ALERT_STATUS_DESC", length = CommonColumnsLengths.MAX_MEDIUM_TEXT_LENGTH )
+    @Column(name = "ALERT_STATUS_DESC", length = CommonColumnsLengths.MAX_MEDIUM_TEXT_LENGTH)
     private String alertStatusDesc;
 
     @Column(name = "ALERT_LEVEL")
@@ -57,7 +56,7 @@ public class DBAlert extends BaseEntity {
     @NotNull
     private AlertLevelEnum alertLevel;
 
-    @Column(name = "MAIL_SUBJECT",length = CommonColumnsLengths.MAX_MEDIUM_TEXT_LENGTH)
+    @Column(name = "MAIL_SUBJECT", length = CommonColumnsLengths.MAX_MEDIUM_TEXT_LENGTH)
     private String mailSubject;
     @Column(name = "MAIL_TO", length = CommonColumnsLengths.MAX_MEDIUM_TEXT_LENGTH)
     private String mailTo;
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/user/DBCredential.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/user/DBCredential.java
index 30adccf87..bcac19305 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/user/DBCredential.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/user/DBCredential.java
@@ -33,66 +33,32 @@ import static eu.europa.ec.edelivery.smp.data.dao.QueryNames.*;
             @Index(name = "SMP_CRD_USER_NAME_TYPE_IDX", columnList = "CREDENTIAL_NAME, CREDENTIAL_TYPE, CREDENTIAL_TARGET",  unique = true),
         })
 @org.hibernate.annotations.Table(appliesTo = "SMP_CREDENTIAL", comment = "Credentials for the users")
-@NamedQueries({
-        @NamedQuery(name = QUERY_CREDENTIAL_ALL, query = "SELECT u FROM DBCredential u"),
-        @NamedQuery(name = QUERY_CREDENTIALS_BY_CI_USERNAME_CREDENTIAL_TYPE_TARGET, query = "SELECT c FROM DBCredential c " +
-                "WHERE upper(c.user.username) = upper(:username) and c.credentialType = :credential_type and c.credentialTarget = :credential_target"),
-        @NamedQuery(name = QUERY_CREDENTIALS_BY_USERID_CREDENTIAL_TYPE_TARGET, query = "SELECT c FROM DBCredential c " +
-                "WHERE c.user.id = :user_id and c.credentialType = :credential_type and c.credentialTarget = :credential_target order by c.id"),
-
-
-        // case-insensitive search
-        @NamedQuery(name = QUERY_CREDENTIAL_BY_CREDENTIAL_NAME_TYPE_TARGET, query = "SELECT c FROM DBCredential c " +
-                "WHERE c.name = :credential_name and c.credentialType = :credential_type and c.credentialTarget = :credential_target"),
-        @NamedQuery(name = QUERY_CREDENTIAL_BY_CERTIFICATE_ID, query = "SELECT u FROM DBCredential u WHERE u.certificate.certificateId = :certificate_identifier"),
-        @NamedQuery(name = QUERY_CREDENTIAL_BY_CI_CERTIFICATE_ID, query = "SELECT u FROM DBCredential u WHERE upper(u.certificate.certificateId) = upper(:certificate_identifier)"),
-
-        //@NamedQuery(name = "DBUser.getUserByPatId", query = "SELECT u FROM DBUser u WHERE u.accessTokenIdentifier = :patId"),
-        //@NamedQuery(name = "DBUser.getUserByCertificateIdCaseInsensitive", query = "SELECT u FROM DBUser u WHERE upper(u.certificate.certificateId) = upper(:certificateId)"),
-        /*@NamedQuery(name = "DBUser.getUsersForBeforePasswordExpireAlerts",
-                query = "SELECT u FROM DBUser u WHERE u.passwordExpireOn IS NOT NULL" +
-                        " AND u.passwordExpireOn <= :startAlertDate " +
-                        " AND u.passwordExpireOn > :expireDate" +
-                        " AND (u.passwordExpireAlertOn IS NULL OR u.passwordExpireAlertOn < :lastSendAlertDate )"),
-        @NamedQuery(name = "DBUser.getUsersForPasswordExpiredAlerts",
-                query = "SELECT u FROM DBUser u WHERE u.passwordExpireOn IS NOT NULL" +
-                        " AND u.passwordExpireOn > :endAlertDate " +
-                        " AND u.passwordExpireOn <= :expireDate" +
-                        " AND (u.passwordExpireAlertOn IS NULL " +
-                        "   OR u.passwordExpireAlertOn <= u.passwordExpireOn " +
-                        "   OR u.passwordExpireAlertOn < :lastSendAlertDate )"),
-
-        @NamedQuery(name = "DBUser.getUsersForBeforeAccessTokenExpireAlerts",
-                query = "SELECT u FROM DBUser u WHERE u.accessTokenExpireOn IS NOT NULL" +
-                        " AND u.accessTokenExpireOn <= :startAlertDate " +
-                        " AND u.accessTokenExpireOn > :expireDate" +
-                        " AND (u.accessTokenExpireAlertOn IS NULL OR u.accessTokenExpireAlertOn < :lastSendAlertDate )"),
-        @NamedQuery(name = "DBUser.getUsersForAccessTokenExpiredAlerts",
-                query = "SELECT u FROM DBUser u WHERE u.accessTokenExpireOn IS NOT NULL" +
-                        " AND u.accessTokenExpireOn > :endAlertDate " +
-                        " AND u.accessTokenExpireOn <= :expireDate" +
-                        " AND (u.accessTokenExpireAlertOn IS NULL " +
-                        "   OR u.accessTokenExpireAlertOn <= u.accessTokenExpireOn " +
-                        "   OR u.accessTokenExpireAlertOn < :lastSendAlertDate )"),
-/*
-        @NamedQuery(name = "DBUser.getUsersForBeforeCertificateExpireAlerts",
-                query = "SELECT u FROM DBUser u WHERE u.certificate IS NOT NULL" +
-                        " AND u.certificate.validTo IS NOT NULL " +
-                        " AND u.certificate.validTo <= :startAlertDate " +
-                        " AND u.certificate.validTo > :expireDate" +
-                        " AND (u.certificate.certificateLastExpireAlertOn IS NULL " +
-                        "       OR u.certificate.certificateLastExpireAlertOn < :lastSendAlertDate )"),
-        @NamedQuery(name = "DBUser.getUsersForCertificateExpiredAlerts",
-                query = "SELECT u FROM DBUser u WHERE u.certificate IS NOT NULL" +
-                        " AND u.certificate.validTo IS NOT NULL " +
-                        " AND u.certificate.validTo > :endAlertDate " +
-                        " AND u.certificate.validTo <= :expireDate" +
-                        " AND (u.certificate.certificateLastExpireAlertOn IS NULL " +
-                        "     OR u.certificate.certificateLastExpireAlertOn <= u.certificate.validTo " +
-                        "     OR u.certificate.certificateLastExpireAlertOn < :lastSendAlertDate )")
-        */
+@NamedQuery(name = QUERY_CREDENTIAL_ALL, query = "SELECT u FROM DBCredential u")
+@NamedQuery(name = QUERY_CREDENTIALS_BY_CI_USERNAME_CREDENTIAL_TYPE_TARGET, query = "SELECT c FROM DBCredential c " +
+        "WHERE upper(c.user.username) = upper(:username) and c.credentialType = :credential_type and c.credentialTarget = :credential_target")
+@NamedQuery(name = QUERY_CREDENTIALS_BY_USERID_CREDENTIAL_TYPE_TARGET, query = "SELECT c FROM DBCredential c " +
+        "WHERE c.user.id = :user_id and c.credentialType = :credential_type and c.credentialTarget = :credential_target order by c.id")
+// case-insensitive search
+@NamedQuery(name = QUERY_CREDENTIAL_BY_CREDENTIAL_NAME_TYPE_TARGET, query = "SELECT c FROM DBCredential c " +
+        "WHERE c.name = :credential_name and c.credentialType = :credential_type and c.credentialTarget = :credential_target")
+@NamedQuery(name = QUERY_CREDENTIAL_BY_CERTIFICATE_ID, query = "SELECT u FROM DBCredential u WHERE u.certificate.certificateId = :certificate_identifier")
+@NamedQuery(name = QUERY_CREDENTIAL_BY_CI_CERTIFICATE_ID, query = "SELECT u FROM DBCredential u WHERE upper(u.certificate.certificateId) = upper(:certificate_identifier)")
+
+@NamedQuery(name = QUERY_CREDENTIAL_BEFORE_EXPIRE,
+        query = "SELECT distinct c FROM DBCredential c WHERE c.credentialType=:credential_type  " +
+                " AND c.expireOn IS NOT NULL" +
+                " AND c.expireOn <= :start_alert_send_date " +
+                " AND c.expireOn > :expire_test_date" +
+                " AND (c.expireAlertOn IS NULL OR c.expireAlertOn < :lastSendAlertDate )")
+@NamedQuery(name = QUERY_CREDENTIAL_EXPIRED,
+        query = "SELECT distinct c FROM DBCredential c WHERE  c.credentialType=:credential_type" +
+                " AND  c.expireOn IS NOT NULL" +
+                " AND c.expireOn > :endAlertDate " +
+                " AND c.expireOn <= :expire_test_date" +
+                " AND (c.expireAlertOn IS NULL " +
+                "   OR c.expireAlertOn <= c.expireOn " +
+                "   OR c.expireAlertOn < :lastSendAlertDate )")
 
-})
 
 @NamedNativeQueries({
         @NamedNativeQuery(name = "DBCredentialDeleteValidation.validateUsersForOwnership",
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/user/DBUser.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/user/DBUser.java
index 637a7581a..5d997c51b 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/user/DBUser.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/user/DBUser.java
@@ -58,50 +58,52 @@ import static eu.europa.ec.edelivery.smp.data.dao.QueryNames.*;
 // @NamedQuery(name = "DBUser.getUserByCertificateId", query = "SELECT u FROM DBUser u WHERE u.certificate.certificateId = :certificateId"),
 //@NamedQuery(name = "DBUser.getUserByPatId", query = "SELECT u FROM DBUser u WHERE u.accessTokenIdentifier = :patId"),
 //@NamedQuery(name = "DBUser.getUserByCertificateIdCaseInsensitive", query = "SELECT u FROM DBUser u WHERE upper(u.certificate.certificateId) = upper(:certificateId)"),
-        /*@NamedQuery(name = "DBUser.getUsersForBeforePasswordExpireAlerts",
-                query = "SELECT u FROM DBUser u WHERE u.passwordExpireOn IS NOT NULL" +
-                        " AND u.passwordExpireOn <= :startAlertDate " +
-                        " AND u.passwordExpireOn > :expireDate" +
-                        " AND (u.passwordExpireAlertOn IS NULL OR u.passwordExpireAlertOn < :lastSendAlertDate )"),
-        @NamedQuery(name = "DBUser.getUsersForPasswordExpiredAlerts",
-                query = "SELECT u FROM DBUser u WHERE u.passwordExpireOn IS NOT NULL" +
-                        " AND u.passwordExpireOn > :endAlertDate " +
-                        " AND u.passwordExpireOn <= :expireDate" +
-                        " AND (u.passwordExpireAlertOn IS NULL " +
-                        "   OR u.passwordExpireAlertOn <= u.passwordExpireOn " +
-                        "   OR u.passwordExpireAlertOn < :lastSendAlertDate )"),
-
-        @NamedQuery(name = "DBUser.getUsersForBeforeAccessTokenExpireAlerts",
-                query = "SELECT u FROM DBUser u WHERE u.accessTokenExpireOn IS NOT NULL" +
-                        " AND u.accessTokenExpireOn <= :startAlertDate " +
-                        " AND u.accessTokenExpireOn > :expireDate" +
-                        " AND (u.accessTokenExpireAlertOn IS NULL OR u.accessTokenExpireAlertOn < :lastSendAlertDate )"),
-        @NamedQuery(name = "DBUser.getUsersForAccessTokenExpiredAlerts",
-                query = "SELECT u FROM DBUser u WHERE u.accessTokenExpireOn IS NOT NULL" +
-                        " AND u.accessTokenExpireOn > :endAlertDate " +
-                        " AND u.accessTokenExpireOn <= :expireDate" +
-                        " AND (u.accessTokenExpireAlertOn IS NULL " +
-                        "   OR u.accessTokenExpireAlertOn <= u.accessTokenExpireOn " +
-                        "   OR u.accessTokenExpireAlertOn < :lastSendAlertDate )"),
+@NamedQuery(name = QUERY_USER_BEFORE_PASSWORD_EXPIRE,
+                query = "SELECT distinct u FROM DBUser u JOIN DBCredential  c ON u.id = c.user.id  WHERE  c.credentialType=:credential_type  " +
+                        " AND c.expireOn IS NOT NULL" +
+                        " AND c.expireOn <= :start_alert_send_date " +
+                        " AND c.expireOn > :expire_test_date" +
+                        " AND (c.expireAlertOn IS NULL OR c.expireAlertOn < :lastSendAlertDate )")
+@NamedQuery(name = QUERY_USER_WITH_PASSWORD_EXPIRED,
+        query = "SELECT distinct u FROM DBUser u JOIN DBCredential  c ON u.id = c.user.id  WHERE  c.credentialType=:credential_type" +
+                " AND  c.expireOn IS NOT NULL" +
+                " AND c.expireOn > :endAlertDate " +
+                " AND c.expireOn <= :expire_test_date" +
+                " AND (c.expireAlertOn IS NULL " +
+                "   OR c.expireAlertOn <= c.expireOn " +
+                "   OR c.expireAlertOn < :lastSendAlertDate )")
 /*
-        @NamedQuery(name = "DBUser.getUsersForBeforeCertificateExpireAlerts",
-                query = "SELECT u FROM DBUser u WHERE u.certificate IS NOT NULL" +
-                        " AND u.certificate.validTo IS NOT NULL " +
-                        " AND u.certificate.validTo <= :startAlertDate " +
-                        " AND u.certificate.validTo > :expireDate" +
-                        " AND (u.certificate.certificateLastExpireAlertOn IS NULL " +
-                        "       OR u.certificate.certificateLastExpireAlertOn < :lastSendAlertDate )"),
-        @NamedQuery(name = "DBUser.getUsersForCertificateExpiredAlerts",
-                query = "SELECT u FROM DBUser u WHERE u.certificate IS NOT NULL" +
-                        " AND u.certificate.validTo IS NOT NULL " +
-                        " AND u.certificate.validTo > :endAlertDate " +
-                        " AND u.certificate.validTo <= :expireDate" +
-                        " AND (u.certificate.certificateLastExpireAlertOn IS NULL " +
-                        "     OR u.certificate.certificateLastExpireAlertOn <= u.certificate.validTo " +
-
-                        "     OR u.certificate.certificateLastExpireAlertOn < :lastSendAlertDate )")
-                        })
-         */
+@NamedQuery(name = "DBUser.getUsersForBeforeAccessTokenExpireAlerts",
+        query = "SELECT u FROM DBUser u WHERE u.accessTokenExpireOn IS NOT NULL" +
+                " AND u.accessTokenExpireOn <= :startAlertDate " +
+                " AND u.accessTokenExpireOn > :expire_test_date" +
+                " AND (u.accessTokenExpireAlertOn IS NULL OR u.accessTokenExpireAlertOn < :lastSendAlertDate )"),
+@NamedQuery(name = "DBUser.getUsersForAccessTokenExpiredAlerts",
+        query = "SELECT u FROM DBUser u WHERE u.accessTokenExpireOn IS NOT NULL" +
+                " AND u.accessTokenExpireOn > :endAlertDate " +
+                " AND u.accessTokenExpireOn <= :expire_test_date" +
+                " AND (u.accessTokenExpireAlertOn IS NULL " +
+                "   OR u.accessTokenExpireAlertOn <= u.accessTokenExpireOn " +
+                "   OR u.accessTokenExpireAlertOn < :lastSendAlertDate )"),
+/*
+@NamedQuery(name = "DBUser.getUsersForBeforeCertificateExpireAlerts",
+        query = "SELECT u FROM DBUser u WHERE u.certificate IS NOT NULL" +
+                " AND u.certificate.validTo IS NOT NULL " +
+                " AND u.certificate.validTo <= :startAlertDate " +
+                " AND u.certificate.validTo > :expire_test_date" +
+                " AND (u.certificate.certificateLastExpireAlertOn IS NULL " +
+                "       OR u.certificate.certificateLastExpireAlertOn < :lastSendAlertDate )"),
+@NamedQuery(name = "DBUser.getUsersForCertificateExpiredAlerts",
+        query = "SELECT u FROM DBUser u WHERE u.certificate IS NOT NULL" +
+                " AND u.certificate.validTo IS NOT NULL " +
+                " AND u.certificate.validTo > :endAlertDate " +
+                " AND u.certificate.validTo <= :expire_test_date" +
+                " AND (u.certificate.certificateLastExpireAlertOn IS NULL " +
+                "     OR u.certificate.certificateLastExpireAlertOn <= u.certificate.validTo " +
+
+                "     OR u.certificate.certificateLastExpireAlertOn < :lastSendAlertDate )")
+                })
+ */
 @NamedNativeQuery(name = "DBUserDeleteValidation.validateUsersForOwnership",
         resultSetMapping = "DBUserDeleteValidationMapping",
         query = "SELECT S.ID as ID, S.USERNAME as USERNAME, " +
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CredentialService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CredentialService.java
index 72499e711..12615fb9b 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CredentialService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CredentialService.java
@@ -109,7 +109,7 @@ public class CredentialService {
                 userDetails);
         try {
             if (!BCrypt.checkpw(userCredentialToken, credential.getValue())) {
-                LOG.securityWarn(SMPMessageCode.SEC_INVALID_USER_CREDENTIALS, username);
+                LOG.securityWarn(SMPMessageCode.SEC_INVALID_USER_CREDENTIALS, username, credential.getName(), credential.getCredentialType(), credential.getCredentialTarget());
                 loginAttemptFailedAndThrowError(credential, true, startTime);
             }
             credential.setSequentialLoginFailureCount(0);
@@ -335,7 +335,8 @@ public class CredentialService {
         mCredentialDao.update(credential);
         String username = credential.getUser().getUsername();
         LOG.securityWarn(SMPMessageCode.SEC_INVALID_USER_CREDENTIALS, username,
-                credential.getName(), credential.getCredentialType(),
+                credential.getName(),
+                credential.getCredentialType(),
                 credential.getCredentialTarget());
 
         boolean isUserSuspended = credential.getSequentialLoginFailureCount() >= getLoginMaxAttempts(credentialType);
@@ -344,11 +345,11 @@ public class CredentialService {
             // at notYetSuspended alert is sent for all settings AT_LOGON, WHEN_BLOCKED
             if (notYetSuspended ||
                     getAlertBeforeUserSuspendedAlertMoment() == AlertSuspensionMomentEnum.AT_LOGON) {
-                alertService.alertCredentialsSuspended(credential.getUser(), credential.getCredentialType());
+                alertService.alertCredentialsSuspended(credential);
             }
         } else {
             // always invoke the method. The method handles the smp.alert.user.login_failure.enabled
-            alertService.alertCredentialVerificationFailed(credential.getUser(), credential.getCredentialType());
+            alertService.alertCredentialVerificationFailed(credential);
         }
         delayResponse(credentialType, startTime);
         if (isUserSuspended) {
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CredentialValidatorService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CredentialValidatorService.java
index 172a2f8d5..cc885de2e 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CredentialValidatorService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CredentialValidatorService.java
@@ -1,7 +1,7 @@
 package eu.europa.ec.edelivery.smp.services;
 
-import eu.europa.ec.edelivery.smp.data.dao.UserDao;
-import eu.europa.ec.edelivery.smp.data.model.user.DBUser;
+import eu.europa.ec.edelivery.smp.data.dao.CredentialDao;
+import eu.europa.ec.edelivery.smp.data.model.user.DBCredential;
 import eu.europa.ec.edelivery.smp.logging.SMPLogger;
 import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory;
 import eu.europa.ec.edelivery.smp.utils.HttpUtils;
@@ -23,14 +23,14 @@ public class CredentialValidatorService {
 
     private final CredentialsAlertService alertService;
     private final ConfigurationService configurationService;
-    private final UserDao userDao;
+    private final CredentialDao credentialDao;
 
     public CredentialValidatorService(ConfigurationService configurationService,
                                       CredentialsAlertService alertService,
-                                      UserDao userDao) {
+                                      CredentialDao credentialDao) {
         this.configurationService = configurationService;
         this.alertService = alertService;
-        this.userDao = userDao;
+        this.credentialDao = credentialDao;
     }
 
     /**
@@ -59,11 +59,12 @@ public class CredentialValidatorService {
             LOG.debug("Before expire user password validation is disabled");
             return;
         }
-        List<DBUser> dbUserBeforeExpireList = userDao.getBeforePasswordExpireUsersForAlerts(
+        List<DBCredential> dbUserBeforeExpireList = credentialDao.getBeforePasswordExpireUsersForAlerts(
                 configurationService.getAlertBeforeExpirePasswordPeriod(),
                 configurationService.getAlertBeforeExpirePasswordInterval(),
                 configurationService.getAlertCredentialsBatchSize());
-        dbUserBeforeExpireList.forEach(alertService::alertBeforeUsernamePasswordExpire);
+
+        dbUserBeforeExpireList.forEach(alertService::alertBeforeCredentialExpire);
     }
 
     protected void validateCredentialsForExpiredUsernames() {
@@ -72,11 +73,11 @@ public class CredentialValidatorService {
             LOG.debug("Expire user password validation is disabled");
             return;
         }
-        List<DBUser> dbUserExpiredList = userDao.getPasswordExpiredUsersForAlerts(
+        List<DBCredential> dbUserExpiredList = credentialDao.getPasswordExpiredUsersForAlerts(
                 configurationService.getAlertExpiredPasswordPeriod(),
                 configurationService.getAlertExpiredPasswordInterval(),
                 configurationService.getAlertCredentialsBatchSize());
-        dbUserExpiredList.forEach(alertService::alertUsernamePasswordExpired);
+        dbUserExpiredList.forEach(alertService::alertCredentialExpired);
     }
 
     protected void validateCredentialsForBeforeExpireAccessToken() {
@@ -86,11 +87,11 @@ public class CredentialValidatorService {
             LOG.debug("Before expire user AccessToken validation is disabled");
             return;
         }
-        List<DBUser> dbUserBeforeExpireList = userDao.getBeforeAccessTokenExpireUsersForAlerts(
+        List<DBCredential> dbUserBeforeExpireList = credentialDao.getBeforeAccessTokenExpireUsersForAlerts(
                 configurationService.getAlertBeforeExpireAccessTokenPeriod(),
                 configurationService.getAlertBeforeExpireAccessTokenInterval(),
                 configurationService.getAlertCredentialsBatchSize());
-        dbUserBeforeExpireList.forEach(alertService::alertBeforeAccessTokenExpire);
+        dbUserBeforeExpireList.forEach(alertService::alertBeforeCredentialExpire);
     }
 
     protected void validateCredentialsForExpiredAccessToken() {
@@ -99,11 +100,11 @@ public class CredentialValidatorService {
             LOG.debug("Expire user AccessToken validation is disabled");
             return;
         }
-        List<DBUser> dbUserExpiredList = userDao.getAccessTokenExpiredUsersForAlerts(
+        List<DBCredential> dbUserExpiredList = credentialDao.getAccessTokenExpiredUsersForAlerts(
                 configurationService.getAlertExpiredAccessTokenPeriod(),
                 configurationService.getAlertExpiredAccessTokenInterval(),
                 configurationService.getAlertCredentialsBatchSize());
-        dbUserExpiredList.forEach(alertService::alertAccessTokenExpired);
+        dbUserExpiredList.forEach(alertService::alertCredentialExpired);
     }
 
 
@@ -114,11 +115,11 @@ public class CredentialValidatorService {
             LOG.debug("Before expire user Certificate validation is disabled");
             return;
         }
-        List<DBUser> dbUserBeforeExpireList = userDao.getBeforeCertificateExpireUsersForAlerts(
+        List<DBCredential> dbUserBeforeExpireList = credentialDao.getBeforeCertificateExpireUsersForAlerts(
                 configurationService.getAlertBeforeExpireCertificatePeriod(),
                 configurationService.getAlertBeforeExpireCertificateInterval(),
                 configurationService.getAlertCredentialsBatchSize());
-        dbUserBeforeExpireList.forEach(alertService::alertBeforeCertificateExpire);
+        dbUserBeforeExpireList.forEach(alertService::alertBeforeCredentialExpire);
     }
 
     protected void validateCredentialsForExpiredCertificate() {
@@ -127,11 +128,11 @@ public class CredentialValidatorService {
             LOG.debug("Expire user Certificate validation is disabled");
             return;
         }
-        List<DBUser> dbUserExpiredList = userDao.getCertificateExpiredUsersForAlerts(
+        List<DBCredential> dbUserExpiredList = credentialDao.getCertificateExpiredUsersForAlerts(
                 configurationService.getAlertExpiredCertificatePeriod(),
                 configurationService.getAlertExpiredCertificateInterval(),
                 configurationService.getAlertCredentialsBatchSize());
-        dbUserExpiredList.forEach(alertService::alertCertificateExpired);
+        dbUserExpiredList.forEach(alertService::alertCredentialExpired);
     }
 
     /**
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CredentialsAlertService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CredentialsAlertService.java
index e09b336ca..f35f4dc6f 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CredentialsAlertService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CredentialsAlertService.java
@@ -2,9 +2,11 @@ package eu.europa.ec.edelivery.smp.services;
 
 import eu.europa.ec.edelivery.smp.cron.SMPDynamicCronTrigger;
 import eu.europa.ec.edelivery.smp.data.dao.AlertDao;
+import eu.europa.ec.edelivery.smp.data.dao.CredentialDao;
 import eu.europa.ec.edelivery.smp.data.dao.UserDao;
 import eu.europa.ec.edelivery.smp.data.enums.CredentialType;
 import eu.europa.ec.edelivery.smp.data.model.DBAlert;
+import eu.europa.ec.edelivery.smp.data.model.user.DBCredential;
 import eu.europa.ec.edelivery.smp.data.model.user.DBUser;
 import eu.europa.ec.edelivery.smp.data.ui.enums.AlertLevelEnum;
 import eu.europa.ec.edelivery.smp.data.ui.enums.AlertStatusEnum;
@@ -42,159 +44,109 @@ public class CredentialsAlertService {
     final MailService mailService;
     final ConfigurationService configurationService;
     final UserDao userDao;
+    final CredentialDao credentialDao;
     final SMPDynamicCronTrigger alertCronTrigger;
 
     public CredentialsAlertService(AlertDao alertDao,
                                    MailService mailService,
                                    ConfigurationService configurationService,
                                    UserDao userDao,
+                                   CredentialDao credentialDao,
                                    @Qualifier(TRIGGER_BEAN_CREDENTIAL_ALERTS) SMPDynamicCronTrigger alertCronTrigger) {
         this.alertDao = alertDao;
         this.mailService = mailService;
         this.configurationService = configurationService;
         this.userDao = userDao;
+        this.credentialDao = credentialDao;
         this.alertCronTrigger = alertCronTrigger;
     }
 
-    public void alertBeforeUsernamePasswordExpire(DBUser user) {
-        /*
-        LOG.info("Alert username [{}] is about to expire on [{}]", user.getUsername(),
-                ISO_LOCAL_DATE_TIME.format(user.getPasswordExpireOn()));
-
-        String mailTo = user.getEmailAddress();
-        CredentialTypeEnum credentialType = CredentialTypeEnum.USERNAME_PASSWORD;
-        String credentialId = user.getUsername();
-        OffsetDateTime expiredOn = user.getPasswordExpireOn();
-        // alert specific properties
-        String mailSubject = configurationService.getAlertBeforeExpirePasswordMailSubject();
-        AlertLevelEnum alertLevel = configurationService.getAlertBeforeExpirePasswordLevel();
-        AlertTypeEnum alertType = AlertTypeEnum.CREDENTIAL_IMMINENT_EXPIRATION;
-
-        DBAlert alert = createAlert(user.getUsername(), mailSubject, mailTo, alertLevel, alertType);
-
-        alertCredentialExpiration(user, alert, credentialType, credentialId, expiredOn);
-
-         */
-    }
-
-    public void alertUsernamePasswordExpired(DBUser user) {
-        /*
-        LOG.info("Alert username [{}] expired on [{}]", user.getUsername(),
-                ISO_LOCAL_DATE_TIME.format(user.getPasswordExpireOn()));
-
-        String mailTo = user.getEmailAddress();
-        CredentialTypeEnum credentialType = CredentialTypeEnum.USERNAME_PASSWORD;
-        String credentialId = user.getUsername();
-        OffsetDateTime expiredOn = user.getPasswordExpireOn();
-
-        // alert specific properties
-        String mailSubject = configurationService.getAlertExpiredPasswordMailSubject();
-        AlertLevelEnum alertLevel = configurationService.getAlertExpiredPasswordLevel();
-        AlertTypeEnum alertType = AlertTypeEnum.CREDENTIAL_EXPIRED;
-
-        DBAlert alert = createAlert(user.getUsername(), mailSubject, mailTo, alertLevel, alertType);
-
-        alertCredentialExpiration(user, alert, credentialType, credentialId, expiredOn);
-
-         */
-    }
-
-    public void alertBeforeAccessTokenExpire(DBUser user) {
-        /*
-        LOG.info("Alert access token [{}] for user [{}] is about to expire on [{}]",
-                user.getAccessToken(),
+    public void alertBeforeCredentialExpire(DBCredential userCredential) {
+        DBUser user = userCredential.getUser();
+        LOG.info("Alert for credentials type name [{}:{}] for user [{}] is about to expire on [{}]",
+                userCredential.getCredentialType(),
+                userCredential.getName(),
                 user.getUsername(),
-                ISO_LOCAL_DATE_TIME.format(user.getAccessTokenExpireOn()));
+                ISO_LOCAL_DATE_TIME.format(userCredential.getExpireOn()));
 
         String mailTo = user.getEmailAddress();
-        CredentialTypeEnum credentialType = CredentialTypeEnum.ACCESS_TOKEN;
-        String credentialId = user.getAccessTokenIdentifier();
-        OffsetDateTime expiredOn = user.getAccessTokenExpireOn();
+        CredentialType credentialType = userCredential.getCredentialType();
+        String credentialId = userCredential.getName();
+        OffsetDateTime expiredOn = userCredential.getExpireOn();
 
         // alert specific properties
-        String mailSubject = configurationService.getAlertBeforeExpireAccessTokenMailSubject();
-        AlertLevelEnum alertLevel = configurationService.getAlertBeforeExpireAccessTokenLevel();
+        String mailSubject;
+        AlertLevelEnum alertLevel;
+        if (credentialType == CredentialType.ACCESS_TOKEN) {
+            mailSubject = configurationService.getAlertBeforeExpireAccessTokenMailSubject();
+            alertLevel = configurationService.getAlertBeforeExpireAccessTokenLevel();
+        } else if (credentialType == CredentialType.USERNAME_PASSWORD) {
+            mailSubject = configurationService.getAlertBeforeExpirePasswordMailSubject();
+            alertLevel = configurationService.getAlertBeforeExpirePasswordLevel();
+        } else if (credentialType == CredentialType.CERTIFICATE) {
+            mailSubject = configurationService.getAlertBeforeExpireCertificateMailSubject();
+            alertLevel = configurationService.getAlertBeforeExpireCertificateLevel();
+        } else {
+            LOG.warn("Alert service for credential type [{}] is not supported! Skip alerts", credentialType);
+            return;
+        }
+
         AlertTypeEnum alertType = AlertTypeEnum.CREDENTIAL_IMMINENT_EXPIRATION;
 
         DBAlert alert = createAlert(user.getUsername(), mailSubject, mailTo, alertLevel, alertType);
-        alertCredentialExpiration(user, alert, credentialType, credentialId, expiredOn);
-
-         */
+        alertCredentialExpiration(userCredential, alert, credentialType, credentialId, expiredOn);
     }
 
-    public void alertAccessTokenExpired(DBUser user) {
-        /*
-        LOG.info("Alert access token [{}] for user [{}] expired on [{}]",
-                user.getAccessToken(),
+    public void alertCredentialExpired(DBCredential userCredential) {
+        DBUser user = userCredential.getUser();
+        LOG.info("Alert access token [{}:{}] for user [{}] expired on [{}]",
+                userCredential.getCredentialType(),
+                userCredential.getName(),
                 user.getUsername(),
-                ISO_LOCAL_DATE_TIME.format(user.getAccessTokenExpireOn()));
-
-        String mailTo = user.getEmailAddress();
-        CredentialTypeEnum credentialType = CredentialTypeEnum.ACCESS_TOKEN;
-        String credentialId = user.getAccessTokenIdentifier();
-        OffsetDateTime expiredOn = user.getAccessTokenExpireOn();
-
-        // alert specific properties
-        String mailSubject = configurationService.getAlertExpiredAccessTokenMailSubject();
-        AlertLevelEnum alertLevel = configurationService.getAlertExpiredAccessTokenLevel();
-        AlertTypeEnum alertType = AlertTypeEnum.CREDENTIAL_EXPIRED;
-
-        DBAlert alert = createAlert(user.getUsername(), mailSubject, mailTo, alertLevel, alertType);
-        alertCredentialExpiration(user, alert, credentialType, credentialId, expiredOn);
-
-         */
-    }
-
-
-    public void alertBeforeCertificateExpire(DBUser user) {
-        /*
-        LOG.info("Alert Certificate [{}] for user [{}] is about to expire",
-                user.getCertificate().getCertificateId(),
-                user.getUsername());
+                ISO_LOCAL_DATE_TIME.format(userCredential.getExpireOn()));
 
         String mailTo = user.getEmailAddress();
-        CredentialTypeEnum credentialType = CredentialTypeEnum.CERTIFICATE;
-        String credentialId = user.getCertificate().getCertificateId();
-        OffsetDateTime expiredOn = user.getCertificate().getValidTo();
+        CredentialType credentialType = userCredential.getCredentialType();
+        String credentialId = userCredential.getName();
+        OffsetDateTime expiredOn = userCredential.getExpireOn();
 
         // alert specific properties
-        String mailSubject = configurationService.getAlertBeforeExpireCertificateMailSubject();
-        AlertLevelEnum alertLevel = configurationService.getAlertBeforeExpireCertificateLevel();
-        AlertTypeEnum alertType = AlertTypeEnum.CREDENTIAL_IMMINENT_EXPIRATION;
-
-        DBAlert alert = createAlert(user.getUsername(), mailSubject, mailTo, alertLevel, alertType);
-        alertCredentialExpiration(user, alert, credentialType, credentialId, expiredOn);
-
-         */
-    }
-
-    public void alertCertificateExpired(DBUser user) {
-        /*
-        LOG.info("Alert Certificate [{}] for user [{}] expired",
-                user.getCertificate().getCertificateId(),
-                user.getUsername());
+        String mailSubject;
+        AlertLevelEnum alertLevel;
+
+        if (credentialType == CredentialType.ACCESS_TOKEN) {
+            mailSubject = configurationService.getAlertExpiredAccessTokenMailSubject();
+            alertLevel = configurationService.getAlertExpiredAccessTokenLevel();
+        } else if (credentialType == CredentialType.USERNAME_PASSWORD) {
+            mailSubject = configurationService.getAlertExpiredPasswordMailSubject();
+            alertLevel = configurationService.getAlertExpiredPasswordLevel();
+        } else if (credentialType == CredentialType.CERTIFICATE) {
+            mailSubject = configurationService.getAlertExpiredCertificateMailSubject();
+            alertLevel = configurationService.getAlertExpiredCertificateLevel();
+        } else {
+            LOG.warn("Alert service for credential type [{}] is not supported! Skip alerts", credentialType);
+            return;
+        }
 
-        String mailTo = user.getEmailAddress();
-        CredentialTypeEnum credentialType = CredentialTypeEnum.CERTIFICATE;
-        String credentialId = user.getCertificate().getCertificateId();
-        OffsetDateTime expiredOn = user.getCertificate().getValidTo();
 
-        // alert specific properties
-        String mailSubject = configurationService.getAlertExpiredCertificateMailSubject();
-        AlertLevelEnum alertLevel = configurationService.getAlertExpiredCertificateLevel();
         AlertTypeEnum alertType = AlertTypeEnum.CREDENTIAL_EXPIRED;
-
         DBAlert alert = createAlert(user.getUsername(), mailSubject, mailTo, alertLevel, alertType);
-        alertCredentialExpiration(user, alert, credentialType, credentialId, expiredOn);
+        alertCredentialExpiration(userCredential, alert, credentialType, credentialId, expiredOn);
+
 
-         */
     }
 
-    public void alertCredentialVerificationFailed(DBUser user, CredentialType credentialType) {
-        /*
+    public void alertCredentialVerificationFailed(DBCredential credential) {
+        LOG.info("Alert on Login failure [{}]!", credential);
         Boolean loginFailureEnabled = configurationService.getAlertUserLoginFailureEnabled();
         if (!loginFailureEnabled) {
-            LOG.debug("Alert Login failure is disabled!");
+            LOG.warn("Alert Login failure is disabled!");
+            return;
+        }
+        DBUser user = credential.getUser();
+        CredentialType credentialType = credential.getCredentialType();
+        if (credentialType != CredentialType.ACCESS_TOKEN && credentialType != CredentialType.USERNAME_PASSWORD) {
+            LOG.error("Alert for suspended credentials type [{}] is not supported", credentialType);
             return;
         }
 
@@ -203,35 +155,29 @@ public class CredentialsAlertService {
         AlertLevelEnum alertLevel = configurationService.getAlertUserLoginFailureLevel();
         AlertTypeEnum alertType = AlertTypeEnum.CREDENTIAL_VERIFICATION_FAILED;
 
-        Integer failureCount;
-        OffsetDateTime lastFailedLoginDate;
-        String credentialId;
-
-        if (credentialType == CredentialTypeEnum.ACCESS_TOKEN) {
-            failureCount = user.getSequentialTokenLoginFailureCount();
-            lastFailedLoginDate = user.getLastTokenFailedLoginAttempt();
-            credentialId = user.getAccessTokenIdentifier();
-        } else if (credentialType == CredentialTypeEnum.USERNAME_PASSWORD) {
-            failureCount = user.getSequentialLoginFailureCount();
-            lastFailedLoginDate = user.getLastFailedLoginAttempt();
-            credentialId = user.getUsername();
-        } else {
-            LOG.error("Alert for suspended credentials type [{}] is not supported", credentialType);
-            return;
-        }
+        Integer failureCount = credential.getSequentialLoginFailureCount();
+        OffsetDateTime lastFailedLoginDate = credential.getLastFailedLoginAttempt();
+        String credentialId = credential.getName();
+
         DBAlert alert = createAlert(user.getUsername(), mailSubject, mailTo, alertLevel, alertType);
         alertCredentialVerificationFailed(user, alert,
                 credentialType, credentialId,
                 failureCount, lastFailedLoginDate);
 
-         */
+
     }
 
-    public void alertCredentialsSuspended(DBUser user, CredentialType credentialType) {
-        /*
+    public void alertCredentialsSuspended(DBCredential credential) {
+
         Boolean suspensionAlertEnabled = configurationService.getAlertUserSuspendedEnabled();
         if (!suspensionAlertEnabled) {
-            LOG.debug("Alert suspended is disabled!");
+            LOG.info("Alert suspended is disabled!");
+            return;
+        }
+        DBUser user = credential.getUser();
+        CredentialType credentialType = credential.getCredentialType();
+        if (credentialType != CredentialType.ACCESS_TOKEN && credentialType != CredentialType.USERNAME_PASSWORD) {
+            LOG.error("Alert for suspended credentials type [{}] is not supported", credentialType);
             return;
         }
 
@@ -240,32 +186,25 @@ public class CredentialsAlertService {
         AlertLevelEnum alertLevel = configurationService.getAlertUserSuspendedLevel();
         AlertTypeEnum alertType = AlertTypeEnum.CREDENTIAL_SUSPENDED;
 
-        Integer failureCount;
-        OffsetDateTime lastFailedLoginDate;
-        OffsetDateTime suspendedUtil;
-        String credentialId;
-        if (credentialType == CredentialTypeEnum.ACCESS_TOKEN) {
-            failureCount = user.getSequentialTokenLoginFailureCount();
-            lastFailedLoginDate = user.getLastTokenFailedLoginAttempt();
+        Integer failureCount = credential.getSequentialLoginFailureCount();
+        OffsetDateTime lastFailedLoginDate = credential.getLastFailedLoginAttempt();
+        OffsetDateTime suspendedUtil = lastFailedLoginDate.plusSeconds(configurationService.getAccessTokenLoginSuspensionTimeInSeconds());
+        String credentialId = credential.getName();
+
+
+        if (credentialType == CredentialType.ACCESS_TOKEN) {
             suspendedUtil = lastFailedLoginDate.plusSeconds(configurationService.getAccessTokenLoginSuspensionTimeInSeconds());
-            credentialId = user.getAccessTokenIdentifier();
-        } else if (credentialType == CredentialTypeEnum.USERNAME_PASSWORD) {
-            failureCount = user.getSequentialLoginFailureCount();
-            lastFailedLoginDate = user.getLastFailedLoginAttempt();
+        } else if (credentialType == CredentialType.USERNAME_PASSWORD) {
             suspendedUtil = lastFailedLoginDate.plusSeconds(configurationService.getLoginSuspensionTimeInSeconds());
-            credentialId = user.getUsername();
-        } else {
-            LOG.error("Alert for suspended credentials type [{}] is not supported", credentialType);
-            return;
         }
         DBAlert alert = createAlert(user.getUsername(), mailSubject, mailTo, alertLevel, alertType);
 
         alertCredentialSuspended(user, alert,
                 credentialType, credentialId,
-                failureCount, lastFailedLoginDate, suspendedUtil);*/
+                failureCount, lastFailedLoginDate, suspendedUtil);
     }
 
-    public void alertCredentialExpiration(DBUser user,
+    public void alertCredentialExpiration(DBCredential credential,
                                           DBAlert alert,
                                           CredentialType credentialType,
                                           String credentialId,
@@ -285,7 +224,7 @@ public class CredentialsAlertService {
         submitAlertMail(alert);
         // when alert about to expire - check if the next cron execution is expired
         // and set date sent tp null to ensure alert submission in next cron execution
-        userDao.updateAlertSentForUserCredentials(user.getId(), credentialType,
+        credentialDao.updateAlertSentForUserCredentials(credential,
                 alert.getAlertType() == AlertTypeEnum.CREDENTIAL_IMMINENT_EXPIRATION
                         && isNextExecutionExpired(expirationDate) ?
                         null : OffsetDateTime.now());
@@ -298,6 +237,7 @@ public class CredentialsAlertService {
                                                   Integer failedLoginCount,
                                                   OffsetDateTime lastFailedLoginDate
     ) {
+        LOG.info("Prepare alert for credentials [{}] ", credentialId );
         String serverName = HttpUtils.getServerAddress();
         // add alert properties
         alert.addProperty(CredentialVerificationFailedProperties.CREDENTIAL_TYPE.name(), credentialType.name());
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/CredentialDaoAlertsTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/CredentialDaoAlertsTest.java
new file mode 100644
index 000000000..40d09d912
--- /dev/null
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/CredentialDaoAlertsTest.java
@@ -0,0 +1,213 @@
+package eu.europa.ec.edelivery.smp.data.dao;
+
+import eu.europa.ec.edelivery.smp.data.model.user.DBCredential;
+import eu.europa.ec.edelivery.smp.data.model.user.DBUser;
+import eu.europa.ec.edelivery.smp.testutil.TestDBUtils;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.time.OffsetDateTime;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class CredentialDaoAlertsTest extends AbstractBaseDao {
+
+    DBUser okUser = TestDBUtils.createDBUserByUsername("okUser-" + UUID.randomUUID());
+    DBUser beforePasswordExpireNoAlertSend = TestDBUtils.createDBUserByUsername("beforePasswordExpireNoAlertSend-" + UUID.randomUUID());
+    DBUser beforePasswordExpireRecentAlertSend = TestDBUtils.createDBUserByUsername("beforePasswordExpireRecentAlertSend-" + UUID.randomUUID());
+    DBUser beforePasswordExpireAlertSend = TestDBUtils.createDBUserByUsername("beforePasswordExpireAlertSend-" + UUID.randomUUID());
+    // set expired test cases
+    DBUser passwordExpiredNoAlertSend = TestDBUtils.createDBUserByUsername("passwordExpiredNoAlertSend-" + UUID.randomUUID());
+    DBUser passwordExpiredRecentAlertSend = TestDBUtils.createDBUserByUsername("passwordExpiredRecentAlertSend-" + UUID.randomUUID());
+    DBUser passwordExpiredAlertSend = TestDBUtils.createDBUserByUsername("passwordExpiredAlertSend-" + UUID.randomUUID());
+    // ------------
+    // access token users  setup
+    DBUser beforeATExpireNoAlertSend = TestDBUtils.createDBUserByUsername("beforeATExpireNoAlertSend-" + UUID.randomUUID());
+    DBUser beforeATExpireRecentAlertSend = TestDBUtils.createDBUserByUsername("beforeATExpireRecentAlertSend-" + UUID.randomUUID());
+    DBUser beforeATExpireAlertSend = TestDBUtils.createDBUserByUsername("beforeATExpireAlertSend-" + UUID.randomUUID());
+    // set expired test cases
+    DBUser aTExpiredNoAlertSend = TestDBUtils.createDBUserByUsername("ATExpiredNoAlertSend-" + UUID.randomUUID());
+    DBUser aTExpiredRecentAlertSend = TestDBUtils.createDBUserByUsername("ATExpiredRecentAlertSend-" + UUID.randomUUID());
+    DBUser aTExpiredAlertSend = TestDBUtils.createDBUserByUsername("ATExpiredAlertSend-" + UUID.randomUUID());
+
+    // ------------
+    // access token users  setup
+    DBUser beforeCertExpireNoAlertSend = TestDBUtils.createDBUserByCertificate("beforecertxpireNoAlertSend-" + UUID.randomUUID());
+    DBUser beforeCertExpireRecentAlertSend = TestDBUtils.createDBUserByCertificate("beforeATExpireRecentAlertSend-" + UUID.randomUUID());
+    DBUser beforeCertExpireAlertSend = TestDBUtils.createDBUserByCertificate("beforeATExpireAlertSend-" + UUID.randomUUID());
+    // set expired test cases
+    DBUser certExpiredNoAlertSend = TestDBUtils.createDBUserByCertificate("ATExpiredNoAlertSend-" + UUID.randomUUID());
+    DBUser certExpiredRecentAlertSend = TestDBUtils.createDBUserByCertificate("ATExpiredRecentAlertSend-" + UUID.randomUUID());
+    DBUser certExpiredAlertSend = TestDBUtils.createDBUserByCertificate("ATExpiredAlertSend-" + UUID.randomUUID());
+
+    @Autowired
+    CredentialDao testInstance;
+
+    @Autowired
+    UserDao userDao;
+
+    @Before
+    public void setupData() {
+        // persist users to database
+        userDao.persistFlushDetach(okUser);
+        userDao.persistFlushDetach(beforePasswordExpireNoAlertSend);
+        userDao.persistFlushDetach(beforePasswordExpireRecentAlertSend);
+        userDao.persistFlushDetach(beforePasswordExpireAlertSend);
+        userDao.persistFlushDetach(passwordExpiredNoAlertSend);
+        userDao.persistFlushDetach(passwordExpiredRecentAlertSend);
+        userDao.persistFlushDetach(passwordExpiredAlertSend);
+        userDao.persistFlushDetach(beforeATExpireNoAlertSend);
+        userDao.persistFlushDetach(beforeATExpireRecentAlertSend);
+        userDao.persistFlushDetach(beforeATExpireAlertSend);
+        userDao.persistFlushDetach(aTExpiredNoAlertSend);
+        userDao.persistFlushDetach(aTExpiredRecentAlertSend);
+        userDao.persistFlushDetach(aTExpiredAlertSend);
+        userDao.persistFlushDetach(beforeCertExpireNoAlertSend);
+        userDao.persistFlushDetach(beforeCertExpireRecentAlertSend);
+        userDao.persistFlushDetach(beforeCertExpireAlertSend);
+        userDao.persistFlushDetach(certExpiredNoAlertSend);
+        userDao.persistFlushDetach(certExpiredRecentAlertSend);
+        userDao.persistFlushDetach(certExpiredAlertSend);
+        // configure user credentials for various issues
+
+        // set user password credentials to database
+        // reference OK User
+        DBCredential credOkUser = TestDBUtils.createDBCredentialForUser(okUser, null, OffsetDateTime.now().plusDays(90) , null);
+        // test before password expires -  alerts  are send 30 days before they are expired and mail is send every 5 days
+        // set users where
+        // -- user credBeforePasswordExpireNoAlertSend  - password will expire in 20 days - alert must be sent.
+        // -- user credBeforePasswordExpireRecentAlertSend - password will expire in 20 days - but alert was sent 2 days ago
+        // -- user credBeforePasswordExpireAlertSend -  password will expire in 20 days and alert was sent 10 days ago -  alert must be sent again
+        DBCredential credBeforePasswordExpireNoAlertSend = TestDBUtils.createDBCredentialForUser(beforePasswordExpireNoAlertSend, null,
+                OffsetDateTime.now().plusDays(20), null);
+        DBCredential credBeforePasswordExpireRecentAlertSend = TestDBUtils.createDBCredentialForUser(beforePasswordExpireRecentAlertSend, null,
+                OffsetDateTime.now().plusDays(20), OffsetDateTime.now().minusDays(2));
+        DBCredential credBeforePasswordExpireAlertSend = TestDBUtils.createDBCredentialForUser(beforePasswordExpireAlertSend, null,
+                OffsetDateTime.now().plusDays(20),OffsetDateTime.now().minusDays(10));
+        // -- user 1  - password expired 20 days aga alert must be sent.
+        // -- user 2 - password  expired 20 ago  - but alert was sent 2 days ago - no need to send it yet.
+        // -- user 3 -  password  expired 20 ago and alert was sent 10 days ago -  alert must be sent again
+        DBCredential credPasswordExpiredNoAlertSend = TestDBUtils.createDBCredentialForUser(passwordExpiredNoAlertSend, null,
+                OffsetDateTime.now().minusDays(20), null);
+        DBCredential credPasswordExpiredRecentAlertSend = TestDBUtils.createDBCredentialForUser(passwordExpiredRecentAlertSend, null,
+                OffsetDateTime.now().minusDays(20), OffsetDateTime.now().minusDays(2));
+        DBCredential credPasswordExpiredAlertSend = TestDBUtils.createDBCredentialForUser(passwordExpiredAlertSend, null,
+                OffsetDateTime.now().minusDays(20), OffsetDateTime.now().minusDays(10));
+
+      //-----------------------------------------
+        // set before expired access-token testcases
+        DBCredential credBeforeATExpireNoAlertSend = TestDBUtils.createDBCredentialForUserAccessToken(beforeATExpireNoAlertSend, null,
+                OffsetDateTime.now().plusDays(20), null);
+        DBCredential credBeforeATExpireRecentAlertSend = TestDBUtils.createDBCredentialForUserAccessToken(beforeATExpireRecentAlertSend, null,
+                OffsetDateTime.now().plusDays(20), OffsetDateTime.now().minusDays(2));
+        DBCredential credBeforeATExpireAlertSend = TestDBUtils.createDBCredentialForUserAccessToken(beforeATExpireAlertSend, null,
+                OffsetDateTime.now().plusDays(20),OffsetDateTime.now().minusDays(10));
+        DBCredential credATExpiredNoAlertSend = TestDBUtils.createDBCredentialForUserAccessToken(aTExpiredNoAlertSend, null,
+                OffsetDateTime.now().minusDays(20), null);
+        DBCredential credATExpiredRecentAlertSend = TestDBUtils.createDBCredentialForUserAccessToken(aTExpiredRecentAlertSend, null,
+                OffsetDateTime.now().minusDays(20), OffsetDateTime.now().minusDays(2));
+        DBCredential credATExpiredAlertSend = TestDBUtils.createDBCredentialForUserAccessToken(aTExpiredAlertSend, null,
+                OffsetDateTime.now().minusDays(20), OffsetDateTime.now().minusDays(10));
+
+        //-----------------------------------------
+        // set before expired certificates testcases
+        DBCredential credBeforeCertExpireNoAlertSend = TestDBUtils.createDBCredentialForUserCertificate(beforeCertExpireNoAlertSend, null,
+                OffsetDateTime.now().plusDays(20), null);
+        DBCredential credBeforeCertExpireRecentAlertSend = TestDBUtils.createDBCredentialForUserCertificate(beforeCertExpireRecentAlertSend, null,
+                OffsetDateTime.now().plusDays(20), OffsetDateTime.now().minusDays(2));
+        DBCredential credBeforeCertExpireAlertSend = TestDBUtils.createDBCredentialForUserCertificate(beforeCertExpireAlertSend, null,
+                OffsetDateTime.now().plusDays(20),OffsetDateTime.now().minusDays(10));
+        // set expired certificates testcases
+        DBCredential credCertExpiredNoAlertSend = TestDBUtils.createDBCredentialForUserCertificate(certExpiredNoAlertSend, null,
+                OffsetDateTime.now().minusDays(20), null);
+        DBCredential credCertExpiredRecentAlertSend = TestDBUtils.createDBCredentialForUserCertificate(certExpiredRecentAlertSend, null,
+                OffsetDateTime.now().minusDays(20), OffsetDateTime.now().minusDays(2));
+        DBCredential credCertExpiredAlertSend = TestDBUtils.createDBCredentialForUserCertificate(certExpiredAlertSend, null,
+                OffsetDateTime.now().minusDays(20), OffsetDateTime.now().minusDays(10));
+
+        // persists
+        testInstance.persistFlushDetach(credOkUser);
+        testInstance.persistFlushDetach(credBeforePasswordExpireNoAlertSend);
+        testInstance.persistFlushDetach(credBeforePasswordExpireRecentAlertSend);
+        testInstance.persistFlushDetach(credBeforePasswordExpireAlertSend);
+        testInstance.persistFlushDetach(credPasswordExpiredNoAlertSend);
+        testInstance.persistFlushDetach(credPasswordExpiredRecentAlertSend);
+        testInstance.persistFlushDetach(credPasswordExpiredAlertSend);
+        // access token examples
+        testInstance.persistFlushDetach(credBeforeATExpireNoAlertSend);
+        testInstance.persistFlushDetach(credBeforeATExpireRecentAlertSend);
+        testInstance.persistFlushDetach(credBeforeATExpireAlertSend);
+        testInstance.persistFlushDetach(credATExpiredNoAlertSend);
+        testInstance.persistFlushDetach(credATExpiredRecentAlertSend);
+        testInstance.persistFlushDetach(credATExpiredAlertSend);
+        // certificate examples
+        testInstance.persistFlushDetach(credBeforeCertExpireNoAlertSend);
+        testInstance.persistFlushDetach(credBeforeCertExpireRecentAlertSend);
+        testInstance.persistFlushDetach(credBeforeCertExpireAlertSend);
+        testInstance.persistFlushDetach(credCertExpiredNoAlertSend);
+        testInstance.persistFlushDetach(credCertExpiredRecentAlertSend);
+        testInstance.persistFlushDetach(credCertExpiredAlertSend);
+    }
+
+    @Test
+    public void getPasswordImminentExpireUsers() {
+        List<DBCredential> dbUserList = testInstance.getBeforePasswordExpireUsersForAlerts(30, 5, 200);
+        List<String> usernames = dbUserList.stream().map(DBCredential::getUser).map(DBUser::getUsername).collect(Collectors.toList());
+        assertTrue(usernames.contains(beforePasswordExpireNoAlertSend.getUsername()));
+        assertTrue(usernames.contains(beforePasswordExpireAlertSend.getUsername()));
+    }
+
+    @Test
+    public void getPasswordExpireUsers() {
+        List<DBCredential> dbUserList = testInstance.getPasswordExpiredUsersForAlerts(30, 5, 200);
+        assertEquals(2, dbUserList.size());
+        List<String> usernames = dbUserList.stream().map(DBCredential::getUser).map(DBUser::getUsername).collect(Collectors.toList());
+        assertTrue(usernames.contains(passwordExpiredNoAlertSend.getUsername()));
+        assertTrue(usernames.contains(passwordExpiredAlertSend.getUsername()));
+    }
+
+    @Test
+    public void getAccessTokenImminentExpireUsers() {
+        List<DBCredential> dbUserList = testInstance.getBeforeAccessTokenExpireUsersForAlerts(30, 5, 200);
+        List<String> usernames = dbUserList.stream().map(DBCredential::getUser).map(DBUser::getUsername).collect(Collectors.toList());
+        System.out.println(usernames);
+        assertEquals(2, dbUserList.size());
+        assertTrue(usernames.contains(beforeATExpireNoAlertSend.getUsername()));
+        assertTrue(usernames.contains(beforeATExpireAlertSend.getUsername()));
+    }
+
+    @Test
+    public void getAccessTokenExpireUsers() {
+        List<DBCredential> dbUserList = testInstance.getAccessTokenExpiredUsersForAlerts(30, 5, 200);
+        List<String> usernames = dbUserList.stream().map(DBCredential::getUser).map(DBUser::getUsername).collect(Collectors.toList());
+        System.out.println(usernames);
+        assertEquals(2, dbUserList.size());
+        assertTrue(usernames.contains(aTExpiredNoAlertSend.getUsername()));
+        assertTrue(usernames.contains(aTExpiredAlertSend.getUsername()));
+    }
+
+    @Test
+    public void getCertificateImminentExpireUsers() {
+        List<DBCredential> dbUserList = testInstance.getBeforeCertificateExpireUsersForAlerts(30, 5, 200);
+        List<String> usernames = dbUserList.stream().map(DBCredential::getUser).map(DBUser::getUsername).collect(Collectors.toList());
+        System.out.println(usernames);
+        assertEquals(2, dbUserList.size());
+        assertTrue(usernames.contains(beforeCertExpireNoAlertSend.getUsername()));
+        assertTrue(usernames.contains(beforeCertExpireAlertSend.getUsername()));
+    }
+
+    @Test
+    public void getCertificateExpireUsers() {
+        List<DBCredential> dbUserList = testInstance.getCertificateExpiredUsersForAlerts(30, 5, 200);
+        List<String> usernames = dbUserList.stream().map(DBCredential::getUser).map(DBUser::getUsername).collect(Collectors.toList());
+        System.out.println(usernames);
+        assertEquals(2, dbUserList.size());
+        assertTrue(usernames.contains(certExpiredNoAlertSend.getUsername()));
+        assertTrue(usernames.contains(certExpiredAlertSend.getUsername()));
+    }
+}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/UserDaoAlertsTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/UserDaoAlertsTest.java
deleted file mode 100644
index 58e17229f..000000000
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/UserDaoAlertsTest.java
+++ /dev/null
@@ -1,180 +0,0 @@
-package eu.europa.ec.edelivery.smp.data.dao;
-
-import eu.europa.ec.edelivery.smp.data.model.user.DBUser;
-import eu.europa.ec.edelivery.smp.testutil.TestDBUtils;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.time.OffsetDateTime;
-import java.util.List;
-import java.util.UUID;
-import java.util.stream.Collectors;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-@Ignore
-public class UserDaoAlertsTest extends AbstractBaseDao {
-/*
-    DBUser okUser = TestDBUtils.createDBUserByUsername("okUser-" + UUID.randomUUID().toString());
-    DBUser beforePasswordExpireNoAlertSend = TestDBUtils.createDBUserByUsername("beforePasswordExpireNoAlertSend-" + UUID.randomUUID().toString());
-    DBUser beforePasswordExpireRecentAlertSend = TestDBUtils.createDBUserByUsername("beforePasswordExpireRecentAlertSend-" + UUID.randomUUID().toString());
-    DBUser beforePasswordExpireAlertSend = TestDBUtils.createDBUserByUsername("beforePasswordExpireAlertSend-" + UUID.randomUUID().toString());
-    // set expired test cases
-    DBUser passwordExpiredNoAlertSend = TestDBUtils.createDBUserByUsername("passwordExpiredNoAlertSend-" + UUID.randomUUID().toString());
-    DBUser passwordExpiredRecentAlertSend = TestDBUtils.createDBUserByUsername("passwordExpiredRecentAlertSend-" + UUID.randomUUID().toString());
-    DBUser passwordExpiredAlertSend = TestDBUtils.createDBUserByUsername("passwordExpiredAlertSend-" + UUID.randomUUID().toString());
-    // ------------
-    // access token users  setup
-    DBUser beforeATExpireNoAlertSend = TestDBUtils.createDBUserByUsername("beforeATExpireNoAlertSend-" + UUID.randomUUID().toString());
-    DBUser beforeATExpireRecentAlertSend = TestDBUtils.createDBUserByUsername("beforeATExpireRecentAlertSend-" + UUID.randomUUID().toString());
-    DBUser beforeATExpireAlertSend = TestDBUtils.createDBUserByUsername("beforeATExpireAlertSend-" + UUID.randomUUID().toString());
-    // set expired test cases
-    DBUser aTExpiredNoAlertSend = TestDBUtils.createDBUserByUsername("ATExpiredNoAlertSend-" + UUID.randomUUID().toString());
-    DBUser aTExpiredRecentAlertSend = TestDBUtils.createDBUserByUsername("ATExpiredRecentAlertSend-" + UUID.randomUUID().toString());
-    DBUser aTExpiredAlertSend = TestDBUtils.createDBUserByUsername("ATExpiredAlertSend-" + UUID.randomUUID().toString());
-
-    // ------------
-    // access token users  setup
-    DBUser beforeCertExpireNoAlertSend = TestDBUtils.createDBUserByCertificate("beforecertxpireNoAlertSend-" + UUID.randomUUID().toString());
-    DBUser beforeCertExpireRecentAlertSend = TestDBUtils.createDBUserByCertificate("beforeATExpireRecentAlertSend-" + UUID.randomUUID().toString());
-    DBUser beforeCertExpireAlertSend = TestDBUtils.createDBUserByCertificate("beforeATExpireAlertSend-" + UUID.randomUUID().toString());
-    // set expired test cases
-    DBUser certExpiredNoAlertSend = TestDBUtils.createDBUserByCertificate("ATExpiredNoAlertSend-" + UUID.randomUUID().toString());
-    DBUser certExpiredRecentAlertSend = TestDBUtils.createDBUserByCertificate("ATExpiredRecentAlertSend-" + UUID.randomUUID().toString());
-    DBUser certExpiredAlertSend = TestDBUtils.createDBUserByCertificate("ATExpiredAlertSend-" + UUID.randomUUID().toString());
-
-    @Autowired
-    UserDao testInstance;
-
-    @Before
-    public void setupData() {
-        // reference OK User
-        okUser.setPasswordExpireOn(OffsetDateTime.now().plusDays(90));
-        // set before expired username-password testcases
-        okUser.setPasswordExpireOn(OffsetDateTime.now().plusDays(90));
-        beforePasswordExpireNoAlertSend.setPasswordExpireOn(OffsetDateTime.now().plusDays(20));
-        beforePasswordExpireRecentAlertSend.setPasswordExpireOn(OffsetDateTime.now().plusDays(20));
-        beforePasswordExpireRecentAlertSend.setPasswordExpireAlertOn(OffsetDateTime.now().minusDays(2));
-        beforePasswordExpireAlertSend.setPasswordExpireOn(OffsetDateTime.now().plusDays(20));
-        beforePasswordExpireAlertSend.setPasswordExpireAlertOn(OffsetDateTime.now().minusDays(10));
-        // set expired username-password testcases
-        passwordExpiredNoAlertSend.setPasswordExpireOn(OffsetDateTime.now().minusDays(20));
-        passwordExpiredRecentAlertSend.setPasswordExpireOn(OffsetDateTime.now().minusDays(20));
-        passwordExpiredRecentAlertSend.setPasswordExpireAlertOn(OffsetDateTime.now().minusDays(2));
-        passwordExpiredAlertSend.setPasswordExpireOn(OffsetDateTime.now().minusDays(10));
-        //-----------------------------------------
-        // set before expired access-token testcases
-        beforeATExpireNoAlertSend.setAccessTokenExpireOn(OffsetDateTime.now().plusDays(20));
-        beforeATExpireRecentAlertSend.setAccessTokenExpireOn(OffsetDateTime.now().plusDays(20));
-        beforeATExpireRecentAlertSend.setAccessTokenExpireAlertOn(OffsetDateTime.now().minusDays(2));
-        beforeATExpireAlertSend.setAccessTokenExpireOn(OffsetDateTime.now().plusDays(20));
-        beforeATExpireAlertSend.setAccessTokenExpireAlertOn(OffsetDateTime.now().minusDays(10));
-        // set expired access-token testcases
-        aTExpiredNoAlertSend.setAccessTokenExpireOn(OffsetDateTime.now().minusDays(20));
-        aTExpiredRecentAlertSend.setAccessTokenExpireOn(OffsetDateTime.now().minusDays(20));
-        aTExpiredRecentAlertSend.setAccessTokenExpireAlertOn(OffsetDateTime.now().minusDays(2));
-        aTExpiredAlertSend.setAccessTokenExpireOn(OffsetDateTime.now().minusDays(10));
-        //-----------------------------------------
-        // set before expired certificates testcases
-        beforeCertExpireNoAlertSend.getCertificate().setValidTo(OffsetDateTime.now().plusDays(20));
-        beforeCertExpireRecentAlertSend.getCertificate().setValidTo(OffsetDateTime.now().plusDays(20));
-        beforeCertExpireRecentAlertSend.getCertificate().setCertificateLastExpireAlertOn(OffsetDateTime.now().minusDays(2));
-        beforeCertExpireAlertSend.getCertificate().setValidTo(OffsetDateTime.now().plusDays(20));
-        beforeCertExpireAlertSend.getCertificate().setCertificateLastExpireAlertOn(OffsetDateTime.now().minusDays(10));
-        // set expired certificates testcases
-        certExpiredNoAlertSend.getCertificate().setValidTo(OffsetDateTime.now().minusDays(20));
-        certExpiredRecentAlertSend.getCertificate().setValidTo(OffsetDateTime.now().minusDays(20));
-        certExpiredRecentAlertSend.getCertificate().setCertificateLastExpireAlertOn(OffsetDateTime.now().minusDays(2));
-        certExpiredAlertSend.getCertificate().setValidTo(OffsetDateTime.now().minusDays(10));
-        // persists
-        testInstance.persistFlushDetach(okUser);
-        testInstance.persistFlushDetach(beforePasswordExpireNoAlertSend);
-        testInstance.persistFlushDetach(beforePasswordExpireRecentAlertSend);
-        testInstance.persistFlushDetach(beforePasswordExpireAlertSend);
-
-        testInstance.persistFlushDetach(passwordExpiredNoAlertSend);
-        testInstance.persistFlushDetach(passwordExpiredRecentAlertSend);
-        testInstance.persistFlushDetach(passwordExpiredAlertSend);
-
-        testInstance.persistFlushDetach(beforeATExpireNoAlertSend);
-        testInstance.persistFlushDetach(beforeATExpireRecentAlertSend);
-        testInstance.persistFlushDetach(beforeATExpireAlertSend);
-
-        testInstance.persistFlushDetach(aTExpiredNoAlertSend);
-        testInstance.persistFlushDetach(aTExpiredRecentAlertSend);
-        testInstance.persistFlushDetach(aTExpiredAlertSend);
-        // ---
-        testInstance.persistFlushDetach(beforeCertExpireNoAlertSend);
-        testInstance.persistFlushDetach(beforeCertExpireRecentAlertSend);
-        testInstance.persistFlushDetach(beforeCertExpireAlertSend);
-
-        testInstance.persistFlushDetach(certExpiredNoAlertSend);
-        testInstance.persistFlushDetach(certExpiredRecentAlertSend);
-        testInstance.persistFlushDetach(certExpiredAlertSend);
-    }
-
-    @Test
-    public void getPasswordImminentExpireUsers() {
-        List<DBUser> dbUserList = testInstance.getBeforePasswordExpireUsersForAlerts(30, 5, 200);
-        assertEquals(2, dbUserList.size());
-        List<String> usernames = dbUserList.stream().map(DBUser::getUsername).collect(Collectors.toList());
-        System.out.println(usernames);
-        assertTrue(usernames.contains(beforePasswordExpireNoAlertSend.getUsername()));
-        assertTrue(usernames.contains(beforePasswordExpireAlertSend.getUsername()));
-    }
-
-    @Test
-    public void getPasswordExpireUsers() {
-        List<DBUser> dbUserList = testInstance.getPasswordExpiredUsersForAlerts(30, 5, 200);
-        assertEquals(2, dbUserList.size());
-        List<String> usernames = dbUserList.stream().map(DBUser::getUsername).collect(Collectors.toList());
-        System.out.println(usernames);
-        assertTrue(usernames.contains(passwordExpiredNoAlertSend.getUsername()));
-        assertTrue(usernames.contains(passwordExpiredAlertSend.getUsername()));
-    }
-
-    @Test
-    public void getAccessTokenImminentExpireUsers() {
-        List<DBUser> dbUserList = testInstance.getBeforeAccessTokenExpireUsersForAlerts(30, 5, 200);
-        List<String> usernames = dbUserList.stream().map(DBUser::getUsername).collect(Collectors.toList());
-        System.out.println(usernames);
-        assertEquals(2, dbUserList.size());
-        assertTrue(usernames.contains(beforeATExpireNoAlertSend.getUsername()));
-        assertTrue(usernames.contains(beforeATExpireAlertSend.getUsername()));
-    }
-
-    @Test
-    public void getAccessTokenExpireUsers() {
-        List<DBUser> dbUserList = testInstance.getAccessTokenExpiredUsersForAlerts(30, 5, 200);
-        List<String> usernames = dbUserList.stream().map(DBUser::getUsername).collect(Collectors.toList());
-        System.out.println(usernames);
-        assertEquals(2, dbUserList.size());
-        assertTrue(usernames.contains(aTExpiredNoAlertSend.getUsername()));
-        assertTrue(usernames.contains(aTExpiredAlertSend.getUsername()));
-    }
-
-    @Test
-    public void getCertificateImminentExpireUsers() {
-        List<DBUser> dbUserList = testInstance.getBeforeCertificateExpireUsersForAlerts(30, 5, 200);
-        List<String> usernames = dbUserList.stream().map(DBUser::getUsername).collect(Collectors.toList());
-        System.out.println(usernames);
-        assertEquals(2, dbUserList.size());
-        assertTrue(usernames.contains(beforeCertExpireNoAlertSend.getUsername()));
-        assertTrue(usernames.contains(beforeCertExpireAlertSend.getUsername()));
-    }
-
-    @Test
-    public void getCertificateExpireUsers() {
-        List<DBUser> dbUserList = testInstance.getCertificateExpiredUsersForAlerts(30, 5, 200);
-        List<String> usernames = dbUserList.stream().map(DBUser::getUsername).collect(Collectors.toList());
-        System.out.println(usernames);
-        assertEquals(2, dbUserList.size());
-        assertTrue(usernames.contains(certExpiredNoAlertSend.getUsername()));
-        assertTrue(usernames.contains(certExpiredAlertSend.getUsername()));
-    }
-
- */
-}
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/AlertServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/AlertServiceTest.java
index d619b8674..1a56789e2 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/AlertServiceTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/AlertServiceTest.java
@@ -2,31 +2,18 @@ package eu.europa.ec.edelivery.smp.services;
 
 import eu.europa.ec.edelivery.smp.cron.SMPDynamicCronTrigger;
 import eu.europa.ec.edelivery.smp.data.dao.AlertDao;
+import eu.europa.ec.edelivery.smp.data.dao.CredentialDao;
 import eu.europa.ec.edelivery.smp.data.dao.UserDao;
 import eu.europa.ec.edelivery.smp.data.model.DBAlert;
-import eu.europa.ec.edelivery.smp.data.model.user.DBUser;
 import eu.europa.ec.edelivery.smp.data.ui.enums.AlertLevelEnum;
 import eu.europa.ec.edelivery.smp.data.ui.enums.AlertStatusEnum;
 import eu.europa.ec.edelivery.smp.data.ui.enums.AlertTypeEnum;
-import eu.europa.ec.edelivery.smp.services.mail.MailModel;
 import eu.europa.ec.edelivery.smp.services.mail.MailService;
-import eu.europa.ec.edelivery.smp.services.mail.prop.CredentialSuspendedProperties;
-import eu.europa.ec.edelivery.smp.services.mail.prop.CredentialVerificationFailedProperties;
-import eu.europa.ec.edelivery.smp.services.mail.prop.CredentialsExpirationProperties;
-import eu.europa.ec.edelivery.smp.testutil.TestDBUtils;
 import org.junit.Ignore;
 import org.junit.Test;
-import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
 
-import java.time.OffsetDateTime;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Properties;
-import java.util.stream.Collectors;
-
 import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
 
 @Ignore
 public class AlertServiceTest {
@@ -35,10 +22,11 @@ public class AlertServiceTest {
     MailService mailService = Mockito.mock(MailService.class);
     ConfigurationService configurationService = Mockito.mock(ConfigurationService.class);
     UserDao userDao = Mockito.mock(UserDao.class);
+    CredentialDao credentialDao = Mockito.mock(CredentialDao.class);
     SMPDynamicCronTrigger alertCronTrigger = Mockito.mock(SMPDynamicCronTrigger.class);
 
 
-    CredentialsAlertService testInstance = new CredentialsAlertService(alertDao, mailService, configurationService,userDao,alertCronTrigger);
+    CredentialsAlertService testInstance = new CredentialsAlertService(alertDao, mailService, configurationService, userDao, credentialDao, alertCronTrigger);
 
     @Test
     public void testCreateAlert() {
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CredentialValidatorServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CredentialValidatorServiceTest.java
index 94eff07ad..135ae84ba 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CredentialValidatorServiceTest.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CredentialValidatorServiceTest.java
@@ -1,6 +1,7 @@
 package eu.europa.ec.edelivery.smp.services;
 
-import eu.europa.ec.edelivery.smp.data.dao.UserDao;
+import eu.europa.ec.edelivery.smp.data.dao.CredentialDao;
+import eu.europa.ec.edelivery.smp.data.model.user.DBCredential;
 import eu.europa.ec.edelivery.smp.data.model.user.DBUser;
 import eu.europa.ec.edelivery.smp.utils.HttpUtils;
 import org.junit.Test;
@@ -18,9 +19,9 @@ public class CredentialValidatorServiceTest {
 
     ConfigurationService mockConfigService = Mockito.mock(ConfigurationService.class);
     CredentialsAlertService mockAlertService = Mockito.mock(CredentialsAlertService.class);
-    UserDao mockUserDao = Mockito.mock(UserDao.class);
+    CredentialDao mockCredentialDao = Mockito.mock(CredentialDao.class);
 
-    CredentialValidatorService testInstance = new CredentialValidatorService(mockConfigService, mockAlertService, mockUserDao);
+    CredentialValidatorService testInstance = new CredentialValidatorService(mockConfigService, mockAlertService, mockCredentialDao);
 
     @Test
     public void testSkipCredentialValidationFalseNotCluster() {
@@ -52,7 +53,7 @@ public class CredentialValidatorServiceTest {
 
     @Test
     public void validateCredentialsForBeforeExpireUsernames() {
-        DBUser user = Mockito.mock(DBUser.class);
+        DBCredential userCredentials = Mockito.mock(DBCredential.class);
         Integer iPeriod = 10;
         Integer iInterval = 15;
         Integer iBatchSize = 20;
@@ -61,7 +62,7 @@ public class CredentialValidatorServiceTest {
         doReturn(iPeriod).when(mockConfigService).getAlertBeforeExpirePasswordPeriod();
         doReturn(iInterval).when(mockConfigService).getAlertBeforeExpirePasswordInterval();
         doReturn(iBatchSize).when(mockConfigService).getAlertCredentialsBatchSize();
-        doReturn(Collections.singletonList(user)).when(mockUserDao).getBeforePasswordExpireUsersForAlerts(anyInt(), anyInt(), anyInt());
+        doReturn(Collections.singletonList(userCredentials)).when(mockCredentialDao).getBeforePasswordExpireUsersForAlerts(anyInt(), anyInt(), anyInt());
 
         testInstance.validateCredentialsForBeforeExpireUsernames();
 
@@ -69,23 +70,23 @@ public class CredentialValidatorServiceTest {
         ArgumentCaptor<Integer> period = ArgumentCaptor.forClass(Integer.class);
         ArgumentCaptor<Integer> interval = ArgumentCaptor.forClass(Integer.class);
         ArgumentCaptor<Integer> batchSize = ArgumentCaptor.forClass(Integer.class);
-        ArgumentCaptor<DBUser> userCapture = ArgumentCaptor.forClass(DBUser.class);
+        ArgumentCaptor<DBCredential> userCapture = ArgumentCaptor.forClass(DBCredential.class);
 
 
-        verify(mockUserDao, Mockito.times(1))
+        verify(mockCredentialDao, Mockito.times(1))
                 .getBeforePasswordExpireUsersForAlerts(period.capture(), interval.capture(), batchSize.capture());
         verify(mockAlertService, Mockito.times(1))
-                .alertBeforeUsernamePasswordExpire(userCapture.capture());
+                .alertBeforeCredentialExpire(userCapture.capture());
 
         assertEquals(iPeriod, period.getValue());
         assertEquals(iInterval, interval.getValue());
         assertEquals(iBatchSize, batchSize.getValue());
-        assertEquals(user, userCapture.getValue());
+        assertEquals(userCredentials, userCapture.getValue());
     }
 
     @Test
     public void validateCredentialsForExpiredUsernames() {
-        DBUser user = Mockito.mock(DBUser.class);
+        DBCredential userCredentials = Mockito.mock(DBCredential.class);
         Integer iPeriod = 10;
         Integer iInterval = 15;
         Integer iBatchSize = 20;
@@ -94,7 +95,7 @@ public class CredentialValidatorServiceTest {
         doReturn(iPeriod).when(mockConfigService).getAlertExpiredPasswordPeriod();
         doReturn(iInterval).when(mockConfigService).getAlertExpiredPasswordInterval();
         doReturn(iBatchSize).when(mockConfigService).getAlertCredentialsBatchSize();
-        doReturn(Collections.singletonList(user)).when(mockUserDao).getPasswordExpiredUsersForAlerts(anyInt(), anyInt(), anyInt());
+        doReturn(Collections.singletonList(userCredentials)).when(mockCredentialDao).getPasswordExpiredUsersForAlerts(anyInt(), anyInt(), anyInt());
 
         testInstance.validateCredentialsForExpiredUsernames();
 
@@ -102,23 +103,23 @@ public class CredentialValidatorServiceTest {
         ArgumentCaptor<Integer> period = ArgumentCaptor.forClass(Integer.class);
         ArgumentCaptor<Integer> interval = ArgumentCaptor.forClass(Integer.class);
         ArgumentCaptor<Integer> batchSize = ArgumentCaptor.forClass(Integer.class);
-        ArgumentCaptor<DBUser> userCapture = ArgumentCaptor.forClass(DBUser.class);
+        ArgumentCaptor<DBCredential> userCapture = ArgumentCaptor.forClass(DBCredential.class);
 
 
-        verify(mockUserDao, Mockito.times(1))
+        verify(mockCredentialDao, Mockito.times(1))
                 .getPasswordExpiredUsersForAlerts(period.capture(), interval.capture(), batchSize.capture());
         verify(mockAlertService, Mockito.times(1))
-                .alertUsernamePasswordExpired(userCapture.capture());
+                .alertCredentialExpired(userCapture.capture());
 
         assertEquals(iPeriod, period.getValue());
         assertEquals(iInterval, interval.getValue());
         assertEquals(iBatchSize, batchSize.getValue());
-        assertEquals(user, userCapture.getValue());
+        assertEquals(userCredentials, userCapture.getValue());
     }
 
     @Test
     public void validateCredentialsForBeforeExpireAccessToken() {
-        DBUser user = Mockito.mock(DBUser.class);
+        DBCredential userCredentials = Mockito.mock(DBCredential.class);
         Integer iPeriod = 10;
         Integer iInterval = 15;
         Integer iBatchSize = 20;
@@ -127,7 +128,7 @@ public class CredentialValidatorServiceTest {
         doReturn(iPeriod).when(mockConfigService).getAlertBeforeExpireAccessTokenPeriod();
         doReturn(iInterval).when(mockConfigService).getAlertBeforeExpireAccessTokenInterval();
         doReturn(iBatchSize).when(mockConfigService).getAlertCredentialsBatchSize();
-        doReturn(Collections.singletonList(user)).when(mockUserDao).getBeforeAccessTokenExpireUsersForAlerts(anyInt(), anyInt(), anyInt());
+        doReturn(Collections.singletonList(userCredentials)).when(mockCredentialDao).getBeforeAccessTokenExpireUsersForAlerts(anyInt(), anyInt(), anyInt());
 
         testInstance.validateCredentialsForBeforeExpireAccessToken();
 
@@ -135,23 +136,23 @@ public class CredentialValidatorServiceTest {
         ArgumentCaptor<Integer> period = ArgumentCaptor.forClass(Integer.class);
         ArgumentCaptor<Integer> interval = ArgumentCaptor.forClass(Integer.class);
         ArgumentCaptor<Integer> batchSize = ArgumentCaptor.forClass(Integer.class);
-        ArgumentCaptor<DBUser> userCapture = ArgumentCaptor.forClass(DBUser.class);
+        ArgumentCaptor<DBCredential> userCapture = ArgumentCaptor.forClass(DBCredential.class);
 
 
-        verify(mockUserDao, Mockito.times(1))
+        verify(mockCredentialDao, Mockito.times(1))
                 .getBeforeAccessTokenExpireUsersForAlerts(period.capture(), interval.capture(), batchSize.capture());
         verify(mockAlertService, Mockito.times(1))
-                .alertBeforeAccessTokenExpire(userCapture.capture());
+                .alertBeforeCredentialExpire(userCapture.capture());
 
         assertEquals(iPeriod, period.getValue());
         assertEquals(iInterval, interval.getValue());
         assertEquals(iBatchSize, batchSize.getValue());
-        assertEquals(user, userCapture.getValue());
+        assertEquals(userCredentials, userCapture.getValue());
     }
 
     @Test
     public void validateCredentialsForExpiredAccessToken() {
-        DBUser user = Mockito.mock(DBUser.class);
+        DBCredential userCredentials = Mockito.mock(DBCredential.class);
         Integer iPeriod = 10;
         Integer iInterval = 15;
         Integer iBatchSize = 20;
@@ -160,7 +161,7 @@ public class CredentialValidatorServiceTest {
         doReturn(iPeriod).when(mockConfigService).getAlertExpiredAccessTokenPeriod();
         doReturn(iInterval).when(mockConfigService).getAlertExpiredAccessTokenInterval();
         doReturn(iBatchSize).when(mockConfigService).getAlertCredentialsBatchSize();
-        doReturn(Collections.singletonList(user)).when(mockUserDao).getAccessTokenExpiredUsersForAlerts(anyInt(), anyInt(), anyInt());
+        doReturn(Collections.singletonList(userCredentials)).when(mockCredentialDao).getAccessTokenExpiredUsersForAlerts(anyInt(), anyInt(), anyInt());
 
         testInstance.validateCredentialsForExpiredAccessToken();
 
@@ -168,23 +169,23 @@ public class CredentialValidatorServiceTest {
         ArgumentCaptor<Integer> period = ArgumentCaptor.forClass(Integer.class);
         ArgumentCaptor<Integer> interval = ArgumentCaptor.forClass(Integer.class);
         ArgumentCaptor<Integer> batchSize = ArgumentCaptor.forClass(Integer.class);
-        ArgumentCaptor<DBUser> userCapture = ArgumentCaptor.forClass(DBUser.class);
+        ArgumentCaptor<DBCredential> userCapture = ArgumentCaptor.forClass(DBCredential.class);
 
 
-        verify(mockUserDao, Mockito.times(1))
+        verify(mockCredentialDao, Mockito.times(1))
                 .getAccessTokenExpiredUsersForAlerts(period.capture(), interval.capture(), batchSize.capture());
         verify(mockAlertService, Mockito.times(1))
-                .alertAccessTokenExpired(userCapture.capture());
+                .alertCredentialExpired(userCapture.capture());
 
         assertEquals(iPeriod, period.getValue());
         assertEquals(iInterval, interval.getValue());
         assertEquals(iBatchSize, batchSize.getValue());
-        assertEquals(user, userCapture.getValue());
+        assertEquals(userCredentials, userCapture.getValue());
     }
 
     @Test
     public void validateCredentialsForBeforeExpireCertificate() {
-        DBUser user = Mockito.mock(DBUser.class);
+        DBCredential userCredentials = Mockito.mock(DBCredential.class);
         Integer iPeriod = 10;
         Integer iInterval = 15;
         Integer iBatchSize = 20;
@@ -193,7 +194,7 @@ public class CredentialValidatorServiceTest {
         doReturn(iPeriod).when(mockConfigService).getAlertBeforeExpireCertificatePeriod();
         doReturn(iInterval).when(mockConfigService).getAlertBeforeExpireCertificateInterval();
         doReturn(iBatchSize).when(mockConfigService).getAlertCredentialsBatchSize();
-        doReturn(Collections.singletonList(user)).when(mockUserDao).getBeforeCertificateExpireUsersForAlerts(anyInt(), anyInt(), anyInt());
+        doReturn(Collections.singletonList(userCredentials)).when(mockCredentialDao).getBeforeCertificateExpireUsersForAlerts(anyInt(), anyInt(), anyInt());
 
         testInstance.validateCredentialsForBeforeExpireCertificate();
 
@@ -201,23 +202,23 @@ public class CredentialValidatorServiceTest {
         ArgumentCaptor<Integer> period = ArgumentCaptor.forClass(Integer.class);
         ArgumentCaptor<Integer> interval = ArgumentCaptor.forClass(Integer.class);
         ArgumentCaptor<Integer> batchSize = ArgumentCaptor.forClass(Integer.class);
-        ArgumentCaptor<DBUser> userCapture = ArgumentCaptor.forClass(DBUser.class);
+        ArgumentCaptor<DBCredential> userCapture = ArgumentCaptor.forClass(DBCredential.class);
 
 
-        verify(mockUserDao, Mockito.times(1))
+        verify(mockCredentialDao, Mockito.times(1))
                 .getBeforeCertificateExpireUsersForAlerts(period.capture(), interval.capture(), batchSize.capture());
         verify(mockAlertService, Mockito.times(1))
-                .alertBeforeCertificateExpire(userCapture.capture());
+                .alertBeforeCredentialExpire(userCapture.capture());
 
         assertEquals(iPeriod, period.getValue());
         assertEquals(iInterval, interval.getValue());
         assertEquals(iBatchSize, batchSize.getValue());
-        assertEquals(user, userCapture.getValue());
+        assertEquals(userCredentials, userCapture.getValue());
     }
 
     @Test
     public void validateCredentialsForExpiredCertificate() {
-        DBUser user = Mockito.mock(DBUser.class);
+        DBCredential userCredentials = Mockito.mock(DBCredential.class);
         Integer iPeriod = 10;
         Integer iInterval = 15;
         Integer iBatchSize = 20;
@@ -226,7 +227,7 @@ public class CredentialValidatorServiceTest {
         doReturn(iPeriod).when(mockConfigService).getAlertExpiredCertificatePeriod();
         doReturn(iInterval).when(mockConfigService).getAlertExpiredCertificateInterval();
         doReturn(iBatchSize).when(mockConfigService).getAlertCredentialsBatchSize();
-        doReturn(Collections.singletonList(user)).when(mockUserDao).getCertificateExpiredUsersForAlerts(anyInt(), anyInt(), anyInt());
+        doReturn(Collections.singletonList(userCredentials)).when(mockCredentialDao).getCertificateExpiredUsersForAlerts(anyInt(), anyInt(), anyInt());
 
         testInstance.validateCredentialsForExpiredCertificate();
 
@@ -234,17 +235,17 @@ public class CredentialValidatorServiceTest {
         ArgumentCaptor<Integer> period = ArgumentCaptor.forClass(Integer.class);
         ArgumentCaptor<Integer> interval = ArgumentCaptor.forClass(Integer.class);
         ArgumentCaptor<Integer> batchSize = ArgumentCaptor.forClass(Integer.class);
-        ArgumentCaptor<DBUser> userCapture = ArgumentCaptor.forClass(DBUser.class);
+        ArgumentCaptor<DBCredential> userCapture = ArgumentCaptor.forClass(DBCredential.class);
 
 
-        verify(mockUserDao, Mockito.times(1))
+        verify(mockCredentialDao, Mockito.times(1))
                 .getCertificateExpiredUsersForAlerts(period.capture(), interval.capture(), batchSize.capture());
         verify(mockAlertService, Mockito.times(1))
-                .alertCertificateExpired(userCapture.capture());
+                .alertCredentialExpired(userCapture.capture());
 
         assertEquals(iPeriod, period.getValue());
         assertEquals(iInterval, interval.getValue());
         assertEquals(iBatchSize, batchSize.getValue());
-        assertEquals(user, userCapture.getValue());
+        assertEquals(userCredentials, userCapture.getValue());
     }
 }
diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestDBUtils.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestDBUtils.java
index 7efc4cf24..83b2b0090 100644
--- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestDBUtils.java
+++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestDBUtils.java
@@ -191,10 +191,31 @@ public class TestDBUtils {
         return createDBCredential("name", "value", CredentialType.USERNAME_PASSWORD, CredentialTargetType.UI);
     }
 
-    public static DBCredential createDBCredentialForUser(DBUser user) {
-        return createDBCredential(user, user.getUsername(), "value", CredentialType.USERNAME_PASSWORD, CredentialTargetType.UI);
+    public static DBCredential createDBCredentialForUser(DBUser user, OffsetDateTime from , OffsetDateTime to, OffsetDateTime lastAlertSent ) {
+        DBCredential credential =  createDBCredential(user, user.getUsername(), "value", CredentialType.USERNAME_PASSWORD, CredentialTargetType.UI);
+        credential.setExpireOn(to);
+        credential.setActiveFrom(from);
+        credential.setExpireAlertOn(lastAlertSent);
+        return credential;
     }
 
+    public static DBCredential createDBCredentialForUserAccessToken(DBUser user, OffsetDateTime from , OffsetDateTime to, OffsetDateTime lastAlertSent ) {
+        DBCredential credential =  createDBCredential(user, user.getUsername(), "value", CredentialType.ACCESS_TOKEN, CredentialTargetType.REST_API);
+        credential.setExpireOn(to);
+        credential.setActiveFrom(from);
+        credential.setExpireAlertOn(lastAlertSent);
+        return credential;
+    }
+
+    public static DBCredential createDBCredentialForUserCertificate(DBUser user, OffsetDateTime from , OffsetDateTime to, OffsetDateTime lastAlertSent ) {
+        DBCredential credential =  createDBCredential(user, user.getUsername(), "value", CredentialType.CERTIFICATE, CredentialTargetType.REST_API);
+        credential.setExpireOn(to);
+        credential.setActiveFrom(from);
+        credential.setExpireAlertOn(lastAlertSent);
+        return credential;
+    }
+
+
     public static DBCredential createDBCredential(DBUser dbUser, String name, String value, CredentialType credentialType, CredentialTargetType credentialTargetType) {
         DBCredential dbCredential = new DBCredential();
         dbCredential.setValue(value);
-- 
GitLab